0

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

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

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

我决定采用这个解决方案:从主线程,我将使用创建另一个线程

...
dispatch_async(feedQueue
... 

在这个线程中,我将使用同步调用执行上述调用

...
[NSURLConnection sendSynchronousRequest:urlRequest
...

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

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

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

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

4

1 回答 1

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 ....

}

}

于 2013-08-23T11:32:58.027 回答