我有一个应用程序,当前从Web服务和NSURLConnection及其委托方法中获取json数组。这将返回一组用户。但现在我必须获取用户的积分。我是否需要创建一个新的NSURLConnection来进行第二次调用(但是我如何处理来自两个不同调用的委托方法的数据?)或者有没有办法创建多个操作或什么?
答案 0 :(得分:2)
对于每个请求,您需要一个新的NSURLConnection
。
解决问题的最佳方法是
代表您的用户的“模型”。例如。一个NSArray
字典,其中一个字典代表一个用户。
一个获取用户数组的专用类。它使用类似NSOperation
的异步模式,可能它成为NSOperation
的子类。基本上,它有一个start
方法和一个完成块。此类将NSURLConnection
封装为ivar,响应数据,还可能包含更多状态信息,如NSURLResponse
对象和NSError
对象。让这个类有一个带有参数的完成块,该参数返回预期结果或NSError
。完成块可能具有此签名:
typedef void (^completion_block_t)(id result);
另一个提取用户“点”的专用类。基本上,与上面相同的类。
具有以下签名的异步包装器方法:
typedef void (^completion_block_t)(id result);
-(void) fetchUsersAndPoints:(completion_block_t)completionHandler;
首先获取users数组。然后,当成功完成时,对于每个用户,它获取用户的“点”。当所有异步请求都已完成或发生错误时,它将调用完成处理程序。
第一个提示:你需要使用“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,但由于硬编码数据,这似乎是一种糟糕的方法。