在我的项目中,我一直使用以下结构来使用API数据:
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
// SYNCHRONOUS network request
// Data processing
dispatch_async(dispatch_get_main_queue(), ^{
// UI update
});
});另一方面,我经常看到另一种结构,其中网络请求是异步的(即使用AFNetworking),然后在完成块中处理数据处理和UI更新(这不是异步的-我认为)。以下是我所说的一个例子:
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
operation.responseSerializer = [AFJSONResponseSerializer serializer];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
// Data processing
// UI update
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
// Error handling
}];
[operation start];所以,我的问题是:
我遗漏了什么吗?
发布于 2014-05-02 10:53:13
在我看来,异步调用对于任何语言的联网来说都是更优雅的解决方案。
我希望这能帮到你。
发布于 2014-05-02 11:18:09
在第二种结构中,数据处理不是异步运行的,是吗?
不,不是。它在主线程上运行。但是从远程服务器获取数据的耗时任务已经在另一个线程上完成。一旦数据被检索,数据处理一般不会花费太多时间,并且可以在主线程上运行。在很少的情况下(我没有遇到过任何这样的情况),如果数据处理本身需要时间并出现阻塞UI,那么我们可以使用NSOperations或GCD队列来处理它们。
这是通过使用块来实现的,这就像一个回调函数。
为什么第二种结构比第一种结构更广为人知和广泛呢?
它更容易实现,也更容易理解一旦你知道了块的语法;)
https://stackoverflow.com/questions/23425894
复制相似问题