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



我正在遍历日期列表,并为列表中的每个日期向web服务器发出请求。

我希望在将后续请求发送到服务器之前完全处理每个日期。为此,我使用GCD设置了一个串行分派队列。每次通过日期循环,都会向队列中添加一个块。

我遇到的问题是,我的NSURLConnection是使用标准异步调用设置的。这将导致请求不会阻塞任何后续请求。

我的问题:在这种情况下,我使用同步 NSURLConnection(在调度队列内)是否有意义,或者是否有其他方法可以使用标准异步调用使其工作?

有很多方法可以做到这一点。无论您选择哪种方法,启动连接都需要绑定到处理任务的完成。

  1. 在您添加到串行队列的每个块中,使用同步请求。这可能是当前实现中最快的解决方案,只要您可以接受同步请求的有限错误处理。

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

我认为使用同步NSURLConnection API是一个好主意。你还有其他一些选择。一种方法是围绕NSURLConnection编写一个使用异步NSURLConnection API的包装器对象,这样你就可以获得异步API回调提供的良好信息,包括下载进度,你可以在请求发生时轻松地继续更新你的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];
}
无论哪种方式,您都需要考虑如何适当地处理连接错误。我在不同的地方使用过这两种方法,都很成功。

最新更新