我们如何在 iPhone Xcode 中处理多个 NSURLConnection?

Posted

技术标签:

【中文标题】我们如何在 iPhone Xcode 中处理多个 NSURLConnection?【英文标题】:How can we handle multiple NSURLConnection in iPhone Xcode? 【发布时间】:2012-01-30 10:24:39 【问题描述】:

我正在开发一个小型应用程序,其中有多个 NSURLConnection。我已经创建了该 NSURL 连接,但我不知道如何处理它。我的代码如下所示。

-(void) loadTrafficAndEvent     

    int a=10;
    //Get the map view bounds for fetch the travel time markers from web service
    MKCoordinateRegion region = mapView.region;

    float print = region.center.latitude;

   // NSLog(@"region.center=%g",print);



    CGPoint firstcorner = CGPointMake(self.mapView.bounds.origin.x , mapView.bounds.origin.y);
    CGPoint secondcorner = CGPointMake((self.mapView.bounds.origin.x+mapView.bounds.size.width) , mapView.bounds.origin.y);
    CGPoint thirdcorner  = CGPointMake(self.mapView.bounds.origin.x , (mapView.bounds.origin.y+ mapView.bounds.size.height));
    CGPoint fourthcorner = CGPointMake((self.mapView.bounds.origin.x+mapView.bounds.size.width), (mapView.bounds.origin.y + mapView.bounds.size.height));;


    //Then transform those point into lat,lng values
    CLLocationCoordinate2D mapfirstcorner,mapsecondcorner,mapthirdcorner,mapfourthcorner,requestsender;

    mapfirstcorner  = [mapView convertPoint:firstcorner toCoordinateFromView:mapView];
    mapsecondcorner = [mapView convertPoint:secondcorner toCoordinateFromView:mapView];
    mapthirdcorner  = [mapView convertPoint:thirdcorner toCoordinateFromView:mapView];
    mapfourthcorner = [mapView convertPoint:fourthcorner toCoordinateFromView:mapView];

    NSDateFormatter *dateFormatter; 
    dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"MM-dd-yyyy"];    
    NSString *date = [dateFormatter stringFromDate:[NSDate date]];    
    [dateFormatter release];

    NSString *checksumString = [NSString stringWithFormat:@"TrafficAndEvents%@ForTravelStar", date];

    NSString *md5Checksum = [self getMD5CheckSum:checksumString];

    NSString *url = [NSString stringWithFormat:@"http://www.travelstar.nl/travelstarwebservice/ProviderServices.asmx/GetTrafficStatusAndEvent?northWestLatitude=%f&northWestLongitude=%f&southEastLatitude=%f&southEastLongitude=%f&zoomLevel=%d&date=%@&checksum=%@", mapfirstcorner.latitude,mapfirstcorner.longitude, self.mapView.region.center.latitude, self.mapView.region.center.longitude, a,date,md5Checksum];

    NSString *url1 = [NSString stringWithFormat:@"http://www.travelstar.nl/travelstarwebservice/ProviderServices.asmx/GetTrafficStatusAndEvent?northWestLatitude=%f&northWestLongitude=%f&southEastLatitude=%f&southEastLongitude=%f&zoomLevel=%d&date=%@&checksum=%@", mapsecondcorner.latitude,mapsecondcorner.longitude, self.mapView.region.center.latitude, self.mapView.region.center.longitude, a,date,md5Checksum];

    NSString *url2 = [NSString stringWithFormat:@"http://www.travelstar.nl/travelstarwebservice/ProviderServices.asmx/GetTrafficStatusAndEvent?northWestLatitude=%f&northWestLongitude=%f&southEastLatitude=%f&southEastLongitude=%f&zoomLevel=%d&date=%@&checksum=%@", mapthirdcorner.latitude,mapthirdcorner.longitude, self.mapView.region.center.latitude, self.mapView.region.center.longitude, a,date,md5Checksum];

    NSString *url3 = [NSString stringWithFormat:@"http://www.travelstar.nl/travelstarwebservice/ProviderServices.asmx/GetTrafficStatusAndEvent?northWestLatitude=%f&northWestLongitude=%f&southEastLatitude=%f&southEastLongitude=%f&zoomLevel=%d&date=%@&checksum=%@", mapfourthcorner.latitude,mapfourthcorner.longitude, self.mapView.region.center.latitude, self.mapView.region.center.longitude, a,date,md5Checksum];

    //Release the request if it is already created.
    if(request1 ) 
        [request release];
        request = nil;
    
    else if(request1 ) 
        [request1 release];
        request1 = nil;
    
    else if(request2 ) 
        [request2 release];
        request2 = nil;
    
    else if(request3 ) 
        [request3 release];
        request3 = nil;
    

    //Release the connection if it is already created.
    if(conn) 
        [conn cancel];
        [conn release];
        conn = nil;        
    
    else if(conn1) 
        [conn1 cancel];
        [conn1 release];
        conn1 = nil;        
    
    else if(conn2) 
        [conn2 cancel];
        [conn2 release];
        conn2 = nil;        
    
    else if(conn3) 
        [conn3 cancel];
        [conn3 release];
        conn3 = nil;        
    

    //If zoom level is grater then 6 then it will request for fetch the travel time markers from the web servce.
    if(a > 6) 

        ZOOM_LEVEL = a;
        //Create the request for fetch the data from web service.
        request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:url]];
        request1 = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:url1]];
        request2 = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:url2]];
        request3 = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:url3]];

        //NSLog(@"%@",url);
        //NSLog(@"Request sent");
        //entryDate = [NSDate date];
        //[entryDate retain];

        //Create the connection with the web service for fetch the data
     // DownloadDelegate *dd = [[DownloadDelegate alloc] init];


        conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];
        conn1 = [[NSURLConnection alloc] initWithRequest:request1 delegate:self];
        conn2 = [[NSURLConnection alloc] initWithRequest:request2 delegate:self];
        conn3 = [[NSURLConnection alloc] initWithRequest:request3 delegate:self];
                      

【问题讨论】:

【参考方案1】:

在 .h 文件中声明 conn,conn1,conn2,conn3。 然后执行以下操作。 在 loadTrafficAndEvent 中:

conn1 = [[NSURLConnection alloc] initWithRequest:request1 delegate:self];

在 connectionDidFinishDownloading: 方法中,

- (void)connectionDidFinishDownloading:(NSURLConnection *)connection destinationURL:(NSURL *)destinationURL
if(connection==conn)
conn1 = [[NSURLConnection alloc] initWithRequest:request1 delegate:self];

else if(connection==conn1)
conn2 = [[NSURLConnection alloc] initWithRequest:request2 delegate:self];

else if(connection==conn2)
conn3 = [[NSURLConnection alloc] initWithRequest:request3 delegate:self];



进行每个if else条件里面的操作,不需要在loadTrafficAndEvent中分配和初始化所有的NSURLConnection:下载会一个接一个地进行。

【讨论】:

:谢谢,很好的解决方案。但是如果我想在所有四个连接的情况下下载所有数据怎么办。 好的,先在.h文件中声明conn,conn1,conn2,conn3,在connectionDidFinishDownloading:方法中,检查if(connection==conn)//这里做代码.... else if(connection==conn1)//code ... 等等。【参考方案2】:

您可能想查看AFNetworking,以更轻松、更整洁地处理网络请求。

【讨论】:

我无法运行你的 github 演示代码。它告诉我“服务器不接受客户端注册 68”MSG。 我不熟悉该消息,但请看这里:***.com/questions/7003155/… ASIHTTPRequest 是外部框架的更好解决方案:allseeing-i.com/ASIHTTPRequest @meccan 我猜是每个人自己的,但看看这个:allseeing-i.com/[request_release];【参考方案3】:

实现 NSURLConnection 委托方法,其余的将自行处理

【讨论】:

以上是关于我们如何在 iPhone Xcode 中处理多个 NSURLConnection?的主要内容,如果未能解决你的问题,请参考以下文章

xcode 多个目标

Xcode 如何在 silicon Mac 上调试 iOS 版本的 App

Xcode 如何在 silicon Mac 上调试 iOS 版本的 App

如何在 Xcode 1.5 中使用 phonegap

如何使用 Xcode 4.3 配置 iPhone/iPad 文件关联?

在 Xcode 中,我们如何删除旧的物理设备?