我找不到合理的答案,所以我会问这个具体案例。
我必须执行http调用(将特定标头设置为标记值)并解析返回的json。 json可以返回“操作已完成”消息或“令牌已过期”消息。
如果令牌过期,我必须执行另一个http调用,它将为我提供刷新的令牌,将令牌设置为标头并重新执行原始的http调用。
我决定采用这个解决方案:从主线程开始,我将使用
创建另一个线程...
dispatch_async(feedQueue
...
并且在此主题中,我将使用
以同步调用执行上述描述的调用...
[NSURLConnection sendSynchronousRequest:urlRequest
...
并且只在流程结束时我调用主线程将结果传递给块。
这种方式代码简单,易于阅读,它具有线性流,它完全限定在一个独特的线程内,并且我不会混淆代理和不同的“有限状态”来管理调用链。
但我不确定这是否是我特定用例的最佳方法,因为我读过类似的问题,人们建议采用异步调用,使用有限状态或NSOperation实例,但在我看来,基于异步调用的这两种方法都不是http调用链的最佳解决方案。
最好的方法是什么?我怎样才能正确实现http调用链?
答案 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 ....
}
}