我在我的项目中使用了以下结构来使用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];
所以,我的问题是:
我有什么遗失的东西吗?
答案 0 :(得分:1)
在我看来,异步调用是用于任何语言的网络的更优雅的解决方案。
我希望这会有所帮助。
答案 1 :(得分:0)
在第二种结构中,没有运行数据处理 异步,是吗?
不,不是。它在主线程上运行。但是从远程服务器获取数据的耗时任务已经在另一个线程上完成。一旦检索到数据,数据处理通常不会花费太多时间,并且可以在主线程上运行。在极少数情况下(我没有遇到任何此类情况)如果数据处理本身需要时间并且似乎阻止UI,那么我们可以使用NSOperations或GCD队列来处理它们。
这是通过使用像回调函数一样的块来实现的。
为什么第二种结构比第一种结构更为人所知和传播?
一旦你知道块的语法,它就更易于实现和理解;)