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

时间:2013-08-23 09:21:36

标签: ios multithreading nsurlconnection

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

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

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

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

创建另一个线程
...
dispatch_async(feedQueue
... 

并且在此主题中,我将使用

同步调用执行上述描述的调用
...
[NSURLConnection sendSynchronousRequest:urlRequest
...

并且只在流程结束时我调用主线程将结果传递给块。

这种方式代码简单,易于阅读,它具有线性流,它完全限定在一个独特的线程内,并且我不会混淆代理和不同的“有限状态”来管理调用链。

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

最好的方法是什么?我怎样才能正确实现http调用链?

1 个答案:

答案 0 :(得分:0)

设置它的正确方法是对NSURLConnection使用异步调用。在connectionDidFinishLoading中,您将拦截刚刚完成的连接并启动下一个链接的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 ....

}

}