2012-07-20 46 views
0

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

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

什么是“正确的”客观的方式来解决这与每个案件?

感谢任何方向

+0

对我来说,这听起来像你没有正确使用GCD。你应该发布代码。 – vikingosegundo 2012-07-20 08:18:55

+0

NSURLConnection有一个sendAsynchronousRequest:queue:completionHandler:方法。你可以使用它。 – Francesco 2012-07-20 08:27:03

回答

0

听起来像一个NSRunLoop问题......阅读例如......

http://www.sortedbits.com/nsurlconnection-in-its-own-thread/ http://www.cocoaintheshell.com/2011/04/nsurlconnection-synchronous -asynchronous/

...谷歌更多...

...为什么你想要做这样?足够使用NSURLConnection(在主线程上),然后在接收到这些数据时对其进行大量处理。换句话说,NSURLConnection委托方法将在主线程上被调用,但是然后调度数据处理而不阻塞主线程。

+0

晚上停下来后,重新思考它,我想出了和你一样的想法。发送请求并接收它是轻量级的工作。是的,只需将重处理发送给GCD。或者,上面的答案也是一个很好的解决方案,如果你想在自己的队列中完成这一切。 – VaporwareWolf 2012-07-21 23:23:08

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很少再使用。

+0

谢谢。正是我在找什么。 – VaporwareWolf 2012-07-21 23:21:36