我可以使用NSURLRequest处理多个操作吗?

时间:2013-06-30 19:19:30

标签: nsurlconnection

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

2 个答案:

答案 0 :(得分:2)

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

解决问题的最佳方法是

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

  2. 一个获取用户数组的专用类。它使用类似NSOperation的异步模式,可能它成为NSOperation的子类。基本上,它有一个start方法和一个完成块。此类将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;
    

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

  5. 第一个提示:你需要使用“continuation”来“链接”两个或多个异步函数。基本原则:

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

    这将是:执行asyncA。如果完成执行asyncB。如果完成执行asyncC。

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

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

    首先要注意:

    您可能需要同步对models数组的访问,以及完成块内对计数器N的访问。

    第二个警告:

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

答案 1 :(得分:0)

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