序列化NSURLConnection请求(iOS) – 使用同步请求?

我正在循环查看date列表,并向列表中的每个date的Web服务器发出请求。

我希望在将后续请求发送到服务器之前完全处理每个date。 为此,我build立了一个使用GCD的串行调度队列。 每次通过date循环时,一个块被添加到队列中。

我遇到的问题是我的NSURLConnection使用标准asynchronous调用进行设置。 这导致请求不会阻止任何后续请求。 他们因此超越对方。

我的问题:这是一个情况下,我有可能使用同步 NSURLConnection(在调度队列内)还是有一些其他方式使它使用标准asynchronous调用工作?

有很多方法可以做到这一点。 无论select什么方法,开始连接都需要与完成处理任务相关联。

  1. 在添加到串行队列的每个块中,使用同步请求。 只要您对同步请求的error handling有限,这可能是您当前实现的最快解决scheme。

  2. 不要使用串行队列。 启动第一个asynchronous连接并处理响应。 处理完成后,启动下一个asynchronous连接。 冲洗并重复。

我认为使用同步NSURLConnection API是一个好主意。 你有其他几个select。 一个是围绕使用asynchronousNSURLConnection API的NSURLConnection编写一个包装对象,这样您就可以获得asynchronousAPIcallback提供的好消息,包括下载进度,在请求发生时可以轻松地继续更新UI,但是提出自己的同步方法来做你需要做的任何事情。 基本上,就像这样:

@implementation MyURLConnectionWrapper - (BOOL)sendRequestWithError:(NSError **)error { error = error ? error : &(NSError *){ nil }; self.finishedLoading = NO; self.connectionError = nil; self.urlConnection = [][NSURLConnection alloc] init...] while (!self.finishedLoading) { [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate: [NSDate distantFuture]]; } if (self.connectionError != nil) { *error = self.connectionError; return NO; } return YES; } @end 

(这一切都是从我的头顶上打下来的,而且是非常简短的,但是应该给你一个基本的想法。)

你也可以做一些事情,比如在完成委托方法中为每一个请求启动一个请求,放弃使用一个串行调度队列:

 - (void)connectionDidFinishLoading:(NSURLConnection *)connection; { [self sendNextRequest]; } 

无论哪种方式,你需要考虑如何适当地处理连接错误。 我已经在不同的地方使用了两种方法,取得了很好的成功