0

我有一个应用程序,该应用程序当前从 NSURLConnection 及其委托方法的 Web 服务中获取 json 数组。这将返回一个用户数组。但现在我必须获取用户的积分。我是否需要创建一个新的 NSURLConnection 来进行第二次调用(但是我将如何处理来自 2 个不同调用的委托方法的数据?)或者有没有办法创建多个操作之类的?

4

2 回答 2

2

对于每个请求,您都需要一个新的NSURLConnection.

解决您的问题的最佳方法是

  1. 代表您的用户的“模型”。例如一个NSArray字典,其中一个字典代表一个用户。

  2. 一个获取用户数组的专用类。它使用异步模式,类似like NSOperation,可能它成为 的子类NSOperation。基本上,它有一个start方法和一个完成块。此类将 a 封装NSURLConnection为 ivar、响应数据以及可能还有一些状态信息,例如NSURLResponse对象,也可能是NSError对象。让这个类有一个带有参数的完成块,该参数返回预期结果或NSError. 完成块可能有这个签名:

    typedef void (^completion_block_t)(id result);
    
  3. 另一个获取用户“点”的专用类。基本上和上面一样。

  4. 具有以下签名的异步包装方法:

    typedef void (^completion_block_t)(id result);
    
    -(void) fetchUsersAndPoints:(completion_block_t)completionHandler;
    

    它首先获取用户数组。然后,当成功完成后,它会为每个用户获取用户的“点”。当所有异步请求都已完成或发生错误时,它会调用完成处理程序。

第一个提示:您需要使用“链接”两个或多个异步函数的“延续”。基本原则:

      asyncA(^(id resultA) {
           asyncB(^id(id resultB){
               ... 
               asyncC(^id(id result){
                   NSLog(@"result: %@", result);    
               });
          }       
      });

这将显示为:执行 asyncA。如果完成执行 asyncB。如果完成执行 asyncC。

第二个提示:您可以同时调用“点请求”。

第三个提示:你知道什么时候所有的“点请求”都完成了,什么时候“点请求”的完成处理程序被调用了N次,其中N是用户数。

第一个警告:

您可能需要同步对模型数组的访问,以及从完成块中对计数器 N 的访问。

第二个注意事项:

当您有太多“点请求”时,您可能需要使用一个队列(NSOperationQueue例如),您可以在其中限制NSURLConnection实例执行的最大并发请求数。

于 2013-07-01T08:58:48.190 回答
0

最干净的方法是为每个连接设置一个属性/ivar,然后将委托方法的参数与它们进行比较。您还可以获取连接请求并获取它的 URL,但由于硬编码数据,这似乎是一种不好的方法。

于 2013-06-30T21:55:52.923 回答