RestKit / AFNetworking - 一次只发送一个请求(队列)

Posted

技术标签:

【中文标题】RestKit / AFNetworking - 一次只发送一个请求(队列)【英文标题】:RestKit / AFNetworking - Send only one request at a time (queue) 【发布时间】:2015-05-06 09:33:34 【问题描述】:

我正在使用 RestKit / AFNetworking 与私有 api 进行通信。此 API 在每次调用时都会返回一个带有 sessionID 的 cookie。如果您使用已使用的 sessionID 进行呼叫,它将返回错误。所以每个 sessionID 只能使用一次。

问题是当同时发送两个请求时,一个会失败,因为它们都在 cookie 中使用相同的 sessionID 发送。

有没有办法让 RestKit / AFNetworking 只在最后一个调用返回下一个 sessionID 后才执行我的调用? 我希望能够只发送呼叫,但在最后一次呼叫成功或失败后延迟它们。

【问题讨论】:

在afnetworking中调用成功或失败块进行第二次调用。 是的,没错。这样可行。但我真的不想这样做,因为 api 调用可能发生在用户输入上。而且我无法预见用户按什么顺序做什么。我也不太想建立自己的排队系统。 cookie是自动设置的还是你需要做点什么? 【参考方案1】:

这正是 NSOperationQueue 的用途:

初始化一个 NSOperationQueue 并将并发任务数设置为 1:

NSOperationQueue *queue = [NSOperationQueue new];
queue.maxConcurrentOperationCount = 1;

一定要保留对队列的引用,否则它将被释放。

要将您的 HTTP 调用添加到队列中,您必须继承 NSOperation。编写您的子类,以便每个 NSOperation 实例在操作的 -main 方法中发出 同步 HTTP 请求,然后为下一个操作设置会话 ID:

-(void)main 
// read the previous session ID
NSString *sessionID = [MyDataSingleton sharedInstance].sessionID;

//make synchronous call
...

//Set the session ID for the next operation
[MyDataSingleton sharedInstance].sessionID = sessionID;

【讨论】:

以上是关于RestKit / AFNetworking - 一次只发送一个请求(队列)的主要内容,如果未能解决你的问题,请参考以下文章

从 AFNetworking 切换到 RestKit

UIImageView+AFNetworking 图像请求队列阻塞来自 RestKit 的其他网络请求

UIImageView+AFNetworking setImageWithURLRequest 使用 RestKit?

RestKit 附带的 AFNetworking 1.3 不支持 IPv6

restkit vs afnetworking vs mknetworkkit vs nsurlconnection有啥区别[关闭]

为 RestKit 框架编写 API 类