对于网络代码,我将在 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 已经很少使用了。