1

我环顾四周,似乎无法为我的问题找到正确的答案。到目前为止,我有一个网络引擎,我从每个视图控制器委托给它来执行我的网络活动。

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

- (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,我会在 a 中接收数据,NSDictionary并根据我为连接设置的标签,将数据传输到所需的NSDictionary.

这工作正常。但现在我需要来自同一个视图控制器的两个请求。因此,当我这样做时,数据会变得混乱。假设我有一个正在实施的搜索连接,当我进行搜索时,可能会输入来自用户详细信息的数据。NSDictionary根据我在里面做的开关,数据没有被分配到右边connectionDidFinishLoading。我为整个网络引擎使用了一个委托。

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

编辑

这是我在其中接收数据的部分connectionDidFinishLoading

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

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

4

3 回答 3

3

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

- (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 它会给出原始请求。

于 2013-10-25T06:16:52.373 回答
1

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

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

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

要记住的几点:为每个下载创建单独的操作类实例,并调用它的“启动方法”。

它看起来像:

 [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 方法。

于 2013-10-25T06:51:11.110 回答
-2

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

NSURLConnection *conn1;
NSURLConnection *conn2;

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

    if(connection == conn1){

    }
    else if(connection == conn2){

    }

}
于 2013-10-25T06:10:55.503 回答