我正在使用NSURLConnection向我的webservice发出一些http请求,这会返回一个大文本文件。显然这会阻塞主线程并增加延迟,所以我想在后台处理它。顺便说一句,我意识到有第三方框架处理这个特定的工作/情况,但我自己编码,因为我需要了解iOS上的多线程。
我可以分离NSThread或将NSURLConnection代码传递给块中的GCD。两种方式最初都可以正常工作(进行http连接并发送请求)。问题是如何从服务器获取数据。让我解释....当我的webservice发回数据时,我的应用程序通过NSURLConnectionDelegate协议的回调通知。但是当这种情况发生时,我的分离线程已经退出它的目标方法,或者该块已经被GCD处理并且它已经脱离队列(取决于我使用的方法)。基本上,我的应用程序没有注意到回调(除非我当然使用dispatch_main_queue)。
每种情况下解决这个问题的“正确”目标是什么?
感谢任何方向
答案 0 :(得分:2)
对于网络代码,我会在NSULRConnection上使用异步方法,并处理我在后台队列上返回的数据。只有修改UI并且需要在主队列上的数据才会被调度(使用GCD)到主队列。
NSOperationQueue *yourQueue = [[NSOperationQueue alloc] init];
[NSULRConnection sendAsynchronousRequest:yourRequest
queue:yourQueue
completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
{
// The code inside here gets processed once the url request completes ...
// It happens in the background on "yourQueue".
[self doSomeExpensiveDataProcessingWithData:data];
dispatch_sync(dispatch_get_main_queue(), ^{
// Update UI on the main thread and wait to continue processing the data
[self updateUI];
});
[self doSomeMoreDataProcessing];
dispatch_sync(dispatch_get_main_queue(), ^{
// Update UI on the main thread and wait to continue processing the data
[self finalUpdateOfUI];
});
}];
在网络代码示例之外,我通常喜欢异步回调作为设计模式。单独测试不同的回调变得容易,它将不同的回调(如错误处理和数据处理)划分为不同的方法,从而在这些方法中提供更集中的代码。
GCD非常适合在另一个线程上快速执行几行代码或异步调度某些工作。
NSThread很少使用。
答案 1 :(得分:0)
听起来像是NSRunLoop问题......请阅读此示例......
http://www.sortedbits.com/nsurlconnection-in-its-own-thread/ http://www.cocoaintheshell.com/2011/04/nsurlconnection-synchronous-asynchronous/
...谷歌更多......
...你为什么要这样做呢?它就足够原样(在主线程上)异步使用NSURLConnection,然后在收到这些数据时重新处理这些数据。换句话说,NSURLConnection委托方法将在主线程上调用,但随后只调度数据处理不阻塞主线程。