2013-10-25 75 views
1

我环顾四周,似乎找不到适合我的问题的正确答案。截至目前,我拥有一个网络引擎,并将其从每个视图控制器委派给其执行我的网络活动。遇到多个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的数据,并根据我设置的标签为了连接,我将数据传输到所需的NSDictionary

这工作正常。但是现在我需要两个来自同一视图控制器的请求。所以当我这样做的时候,数据越来越混乱。假设我有一个正在执行搜索的连接,当我执行搜索时,来自用户详细信息的数据可能会出现。根据我在connectionDidFinishLoading内部进行的切换,数据未被分配到正确的NSDictionary。我为整个网络引擎使用了一个代理。

我是新来的NSURLConnection,我应该设置一个队列还是什么?请帮忙。

编辑

这里的一部分,我在connectionDidFinishLoading接收数据:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    if ([connection.tag integerValue] == kGetUserDetails) 
     networkDataSource.userData = self.jsonDetails; 
    if ([connection.tag integerValue] == kSearchConnection) 
     networkDataSource.searchData = self.jsonDetails; 
} 

并在此之后我有一个要求所需的视图控制器所需的委托的开关情况。

回答

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

这听起来像个好主意。我会给你一个镜头。 – Anil

+0

好的,如有任何问题,请告知我。 –

+0

我也一样。但是当我发送请求时,比如说我在下载用户详细信息时(比如网速很慢)进行搜索,则用户详细信息调用不会继续。只有搜索发生。 – Anil

-2

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

NSURLConnection *conn1; 
NSURLConnection *conn2; 

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

    if(connection == conn1){ 

    } 
    else if(connection == conn2){ 

    } 

} 
+1

我是不是在做同样的事情?我为每个连接分配了不同的NSURLConnection NSURLConnection * conn = [[NSURLConnection alloc] init]; – Anil

1

你可以用很多方式完成他人提到的任务,它会解决你的问题。但是如果你有更多的连接,你需要改变你的方法。

您可以创建一个NSOperation类的子类。通过将字典或数据模型传递给该类,提供所有必需的数据,例如url或任务完成时想要返回的任何其他任何通知。

在Nsoperation类中ovewrite'main'方法并在该方法中启动连接,即将所有NSURRequest语句放在该方法中。当下载完成时与该信息字典一起发送回电话。

要记住的要点:为evey下载创建操作类的separte实例,并调用其“启动方法”。

它看起来是这样的:

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

    [_downloadOperationObj setDelegate:self]; 

    [_downloadOperationObj setSelectorForUpdateComplete:@selector(callBackForDownloadComplete)]; 

    [_downloadOperationObj setQueuePriority:NSOperationQueuePriorityVeryHigh]; 

    [_downloadOperationObj start]; 

metaDict将包含用户信息。 在DownloadFileOperation类将覆盖“主”的方法,如:

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

//  //You url connection code 
    } 
} 

你可以,如果你想要的操作添加到NSOperationQueue。您只需要将操作添加到NSOperationQueue,它将调用其启动方法。