NSThread与GCD一起使用asynch回调

时间:2012-07-20 08:05:01

标签: objective-c

我正在使用NSURLConnection向我的webservice发出一些http请求,这会返回一个大文本文件。显然这会阻塞主线程并增加延迟,所以我想在后台处理它。顺便说一句,我意识到有第三方框架处理这个特定的工作/情况,但我自己编码,因为我需要了解iOS上的多线程。

我可以分离NSThread或将NSURLConnection代码传递给块中的GCD。两种方式最初都可以正常工作(进行http连接并发送请求)。问题是如何从服务器获取数据。让我解释....当我的webservice发回数据时,我的应用程序通过NSURLConnectionDelegate协议的回调通知。但是当这种情况发生时,我的分离线程已经退出它的目标方法,或者该块已经被GCD处理并且它已经脱离队列(取决于我使用的方法)。基本上,我的应用程序没有注意到回调(除非我当然使用dispatch_main_queue)。

每种情况下解决这个问题的“正确”目标是什么?

感谢任何方向

2 个答案:

答案 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委托方法将在主线程上调用,但随后只调度数据处理不阻塞主线程。