2011-12-29 126 views
0

我正在循环查看日期列表并向列表中的每个日期的Web服务器发出请求。序列化NSURLConnection请求(iOS) - 使用同步请求?

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

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

我的问题:这是它将使意义对我来说,使用同步 NSURLConnection的(调度队列中),或者是有一些其他的方式,使其工作使用标准异步调用的情况下?

+0

感谢(安德鲁马德森和Xjones)为您的快速回复。这听起来像是一个同步呼叫将为我工作。 (我希望避免这种情况以及随之而来的额外维护工作。)关于端到端链接呼叫,这是可能的,但我不确定在我的情况下它是否值得。而不是管理一个调度队列,它会让我管理一个日期队列。我认为设置同步呼叫会更简单。 – 2011-12-29 00:48:34

回答

2

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

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

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

1

我认为使用同步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]; 
} 

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