在iOS中链接多个NSUrlConnection的最佳方法

在iOS中链接多个NSUrlConnection的最佳方法,ios,multithreading,nsurlconnection,Ios,Multithreading,Nsurlconnection,我找不到一个合理的答案,所以我会问这个具体的案例 我必须执行http调用(将特定头设置为令牌值)并解析返回的json。json既可以返回“操作完成”消息,也可以返回“令牌过期”消息 如果令牌过期,我必须执行另一个http调用,该调用将为我提供刷新的令牌,将令牌设置为标头,并重新执行原始http调用 我决定采用这个解决方案:从主线程开始,我将使用 ... dispatch_async(feedQueue ... 在这个线程中,我将使用 ... [NSURLConnection sendSync

我找不到一个合理的答案,所以我会问这个具体的案例

我必须执行http调用(将特定头设置为令牌值)并解析返回的json。json既可以返回“操作完成”消息,也可以返回“令牌过期”消息

如果令牌过期,我必须执行另一个http调用,该调用将为我提供刷新的令牌,将令牌设置为标头,并重新执行原始http调用

我决定采用这个解决方案:从主线程开始,我将使用

...
dispatch_async(feedQueue
... 
在这个线程中,我将使用

...
[NSURLConnection sendSynchronousRequest:urlRequest
...
仅在流的末尾,我调用将结果传递给块的主线程

这种方式代码简单易读,它有一个线性流,它完全限定在一个唯一的线程中,我不会用委托和不同的“有限状态”来管理调用链

但我不确定这是否是我的特定用例的最佳方法,因为我读过类似的问题,人们建议采用异步调用,使用有限状态或NSOperation实例,但在我看来,这两种方法都基于异步调用,不是http调用链的最佳解决方案


最好的方法是什么?如何正确实现http调用链?

正确的设置方法是对NSURLConnection使用异步调用。在ConnectionIDFinishLoading中,您将拦截刚刚完成的连接并启动下一个链接http连接

设置一个名为_connection1的私有变量

所以基本上,你会这样做

NSURLRequest * request1 = ...

_connection1 = [[NSURLConnection alloc] initWithRequest:request1 delegate:self];


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

if([connection isEqual:_connection1]){
NSURLRequest *request2 = ...
_connection2 = [NSURLConnection...]


}

if([connection isEqual:_connection2]){
NSURLRequest *request3 = ...
_connection2 = [NSURLConnection...request3 ]


// And so on ....

}

}

Ok,但委托的方法在开始线程(通常是主线程)上被调用,因此这意味着如果我有10个调用链,我将中断主线程10次;如果响应处理耗时,我还应该启动一个新线程来处理web调用结果。最后,我必须声明连接变量并存储传递给load方法的回调块。我的方法完全存在于一个并行线程中。我认为委托方法可能不一定在主线程上调用——这取决于委托的上下文。这是我使用和工作的方式。想知道这里是否有人有更好的方法。是的,主线程是不必要的,但大多数情况下是必要的,否则您必须创建另一个线程以避免主线程阻塞,因此异步方法变得太混乱和无用。也很想看到其他解决方案!