多个NSURLConnection出现问题

时间:2013-10-25 05:50:44

标签: ios iphone objective-c nsurlconnection

我环顾四周,似乎无法找到适合我的问题的答案。截至目前,我有一个网络引擎,我从每个视图控制器委托进行,以执行我的网络活动。

例如,要获取用户详细信息,我有一个这样的方法:

- (void) getUserDetailsWithUserId:(NSString*) userId
{
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@Details", kServerAddress]]];
    request.HTTPMethod = @"POST";

    NSString *stringData = [NSString stringWithFormat:@"%@%@", kUserId, userId];
    NSData *requestBodyData = [stringData dataUsingEncoding:NSUTF8StringEncoding];
    request.HTTPBody = requestBodyData;

    NSURLConnection *conn = [[NSURLConnection alloc] init];
    [conn setTag:kGetUserInfoConnection];
    (void)[conn initWithRequest:request delegate:self];
}

当我在connectionDidFinishLoading中获取数据时,我会收到NSDictionary中的数据,并根据我为连接设置的标记,将数据传输到所需的{{1} }}

这很好用。但现在我需要从同一个视图控制器发出两个请求。因此,当我这样做时,数据变得混乱。假设我正在实施搜索连接,当我进行搜索时,用户详细信息中的数据可能会出现。根据我在NSDictionary内执行的切换,数据未分配到右NSDictionary。我正在为整个网络引擎使用单个代理。

我是connectionDidFinishLoading的新手,我应该设置队列还是什么?请帮忙。

修改

以下是我在NSURLConnection中收到数据的部分:

connectionDidFinishLoading

之后我有一个switch case,为所需的视图控制器调用所需的委托。

3 个答案:

答案 0 :(得分:3)

在这里您需要确定您获得数据的请求, 最简单的检查方法如下,

- (void)connectionDidFinishLoading:(NSURLConnection *)conn
 {
  // Check URL value for request, url for search and user details will be different, put if condition as per your need. 
   conn.currentRequest.URL
 } 

尝试使用conn.originalRequest.URL它将提供原始请求。

答案 1 :(得分:1)

您可以通过多种方式完成其他人提到的任务,它将解决您的问题。但是如果你有更多的联系,你需要改变你的方法。

您可以创建NSOperation类的子类。通过将字典或数据模型传递给该类,提供所有必需的数据,例如url或任何其他任务完成后想要获取的信息。

在Nsoperation类中,ovewrite'main'方法并在该方法中启动连接,即将所有NSURRequest语句放在该方法中。下载完成后再发回一个回复信息。

要记住的要点:为evey下载创建操作类的separte实例,并调用它的'start method'。

它看起来像:

 [self setDownloadOperationObj:[[DownloadFileOperation alloc] initWithData:metadataDict]];

    [_downloadOperationObj setDelegate:self];

    [_downloadOperationObj setSelectorForUpdateComplete:@selector(callBackForDownloadComplete)];

    [_downloadOperationObj setQueuePriority:NSOperationQueuePriorityVeryHigh];

    [_downloadOperationObj start];

metaDict将包含您的用户信息。 在DownloadFileOperation类中,您将覆盖'main'方法,如:

- (void)main {
    // a lengthy operation
    @autoreleasepool
    {
        if(self.isCancelled)
            return;

//      //You url connection code
    }
}

如果需要,您可以将该操作添加到NSOperationQueue。您只需要将操作添加到NSOperationQueue,它将调用其start方法。

答案 2 :(得分:-2)

在.h文件中声明两个NSURLConnection变量。

NSURLConnection *conn1;
NSURLConnection *conn2;

- (void)connectionDidFinishLoading:(NSURLConnection *)connection{

    if(connection == conn1){

    }
    else if(connection == conn2){

    }

}