我环顾四周,似乎无法找到适合我的问题的答案。截至目前,我有一个网络引擎,我从每个视图控制器委托进行,以执行我的网络活动。
例如,要获取用户详细信息,我有一个这样的方法:
- (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,为所需的视图控制器调用所需的委托。
答案 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){
}
}