在iOS上,你可以做一个同步networking请求(但不是在主线程),仍然进展callback(在一个单独的,非主线程)?

在iOS上,你可以做一个同步的networking请求(离开主线程)并获得进度callback(在一个单独的,非主线程)?

我有一个串行(一次一个操作)的后台队列,可以运行所有耗时的作业,而这些作业现在不需要完成。 我确实想要显示下载作业的进度。 它看起来不像你可以实例化一个NSURLConnection并configuration一个委托,启动同步连接,然后获取进度callback。

有没有办法在该背景队列上进行同步请求(同步,因为它后面的作业不会启动,直到完成),仍然得到setProgress:可以发送更新进度条的callback? (callback将不得不在一个不同的队列线程,因为我的串行队列的线程被阻塞,直到请求完成。)

苹果的NSURLConnection文档说,同步请求实际上build立在asynchronous的幕后。 我必须重新实施吗? 我需要一种方法来阻塞线程,直到请求完成/失败。 到目前为止,最好的线索是NSOperationQueuewaitUntilFinished方法,但我不想开始asynchronous并持续轮询同步方法。

NSURLConnection讨论

一个同步加载是build立在该类可用的asynchronous加载代码之上的。 调用线程在asynchronous加载系统对专门为此加载请求生成的线程执行URL加载时被阻塞。 在调用线程中不需要特殊的线程或运行循环configuration来执行同步加载。

在asynchronous请求之上重新实现同步请求并不困难。 您只需手动旋转线程的运行循环,直到看到请求已完成(或失败)。 这是一个粗略的例子:

 NSURLRequest *downloadRequest = [NSURLRequest requestWithURL:queryURL]; // Start the download and wait until it finishes self.downloadFinished = NO; self.downloader = [NSURLConnection connectionWithRequest:downloadRequest delegate:self]; while (!self.isDownloadFinished) { [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; } 

这里是相关的NSURLConnectionDelegate方法:

  - (void)connectionDidFinishLoading:(NSURLConnection *)connection; { self.downloadFinished = YES; } - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error; { NSLog(@"An error occurred: %@", error); self.receivedData = nil; self.downloadFinished = YES; }