目标C:异步块结构VS异步网络请求+完成块

时间:2014-05-02 10:24:51

标签: ios asynchronous block afnetworking-2

我在我的项目中使用了以下结构来使用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];

所以,我的问题是:

  1. 在第二种结构中,数据处理没有异步运行,是吗?
  2. 为什么我们一般鼓励我们运行异步网络请求,而不是从异步块/线程同步。
  3. 为什么第二种结构比第一种结构更为人所知和传播?
  4. 我有什么遗失的东西吗?

2 个答案:

答案 0 :(得分:1)

在我看来,异步调用是用于任何语言的网络的更优雅的解决方案。

  1. 是在该示例中,在主线程中完成数据处理。在UI中解析字符串和创建对象并不是一个cpu周期消耗工作。但是,假设您下载图像并且想要处理它,您不应该在此块中执行此操作(可能会生成另一个线程)。但图像处理是另一个范围。它与网络代码无关,因此网络代码按预期工作。
  2. 使用异步网络呼叫,您可以取消/暂停请求。但是在同步网络电话中,你无法做到这一点。
  3. 首先gcd对于objective-c是新的(我不确定,但是在iOS 4之后它可用。如果我错了,请纠正我)。在此之前我们使用委托,这是很多样板代码。但是使用第二种方法,您可以轻松管理网络代码。
  4. 我希望这会有所帮助。

答案 1 :(得分:0)

  

在第二种结构中,没有运行数据处理   异步,是吗?

不,不是。它在主线程上运行。但是从远程服务器获取数据的耗时任务已经在另一个线程上完成。一旦检索到数据,数据处理通常不会花费太多时间,并且可以在主线程上运行。在极少数情况下(我没有遇到任何此类情况)如果数据处理本身需要时间并且似乎阻止UI,那么我们可以使用NSOperations或GCD队列来处理它们。

这是通过使用像回调函数一样的块来实现的。

  

为什么第二种结构比第一种结构更为人所知和传播?

一旦你知道块的语法,它就更易于实现和理解;)