首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >目标C:异步块结构与异步网络请求+完成块

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

Stack Overflow用户
提问于 2014-05-02 10:24:50
回答 2查看 2.4K关注 0票数 0

在我的项目中,我一直使用以下结构来使用API数据:

代码语言:javascript
复制
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更新(这不是异步的-我认为)。以下是我所说的一个例子:

代码语言:javascript
复制
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. 为什么第二种结构比第一种结构更广为人知和广泛呢?

我遗漏了什么吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-02 10:53:13

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

  1. 是的,在这个例子中,数据处理是在主线程中完成的。在UI中解析字符串和创建对象并不是一项消耗cpu周期的工作。但是,假设您下载了一个映像,并且您想要处理它,您不应该在这个块中这样做(可能会生成另一个线程)。但是图像处理是另一个与网络代码无关的scope.it,所以网络代码是按预期工作的。
  2. 通过异步网络调用,您可以取消/暂停请求。但在同步网络呼叫中,您不能这样做。
  3. 首先,gcd是新的目标-c(我不太确定,但它是在iOS 4之后可用。如果我错了,请纠正我)。在此之前,我们使用的是授权,这是大量的样板代码。但是使用第二种方法,您可以轻松地管理网络代码。

我希望这能帮到你。

票数 1
EN

Stack Overflow用户

发布于 2014-05-02 11:18:09

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

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

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

为什么第二种结构比第一种结构更广为人知和广泛呢?

它更容易实现,也更容易理解一旦你知道了块的语法;)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23425894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档