zek*_*kel 0 nsurlconnection grand-central-dispatch ios
在iOS上,你可以发出同步网络请求(在主线程之外)并获得进度回调(在一个单独的非主线程上)吗?
我有一个运行的所有不需要完成耗时作业的串行(一次操作-AT-A-时间)背景排队的权利了.我确实希望显示下载作业的进度.看起来您不能实例化NSURLConnection
并配置委托,启动同步连接,然后获取进度回调.
有没有办法在该后台队列上发出同步请求(同步,因为它后面的工作直到完成才开始),并且仍然setProgress:
可以发送回调来更新进度条?(回调必须在不同的队列线程上,因为我的串行队列的线程被阻塞,直到请求完成.)
Apple的NSURLConnection文档说,同步请求实际上建立在幕后的异步之上.我必须重新实施吗?我需要一种方法来阻止线程,直到请求完成/失败.到目前为止,我所拥有的最好NSOperationQueue
的waitUntilFinished
方法是 方法,但我不想在同步方法上启动异步并不断轮询.
NSURLConnection讨论
同步加载构建在类可用的异步加载代码之上.当异步加载系统在专门为此加载请求生成的线程上执行URL加载时,将阻止调用线程.在调用线程中,为了执行同步加载,不需要特殊的线程或运行循环配置.
在异步请求之上重新实现同步请求并不难.您只需手动旋转线程的运行循环,直到您看到请求已完成(或失败).这是一个粗略的例子:
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]];
}
Run Code Online (Sandbox Code Playgroud)
以下是相关的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;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2547 次 |
最近记录: |