在很长一段时间里,我认为异步是在后台线程上运行某个东西的同义词,而同步是在主线程上运行(阻止UI更新和交互).我知道不在主线程上运行昂贵的操作是因为它不允许在主线程被占用时执行UI操作,但是为什么同步会很麻烦呢?

然而,我注意到,可以在主线程上进行异步调用,在后台线程上进行同步调用.

我经常听到人们说不要同步或在主线程上使用昂贵的调用,因为这会阻塞用户的UI.这两个问题是我应该确保不做的吗?有什么区别?

推荐答案

当同步调用某个对象时,这意味着启动该操作的线程将等待任务完成后再继续.异步意味着它不会等待.

话虽如此,当人们建议你异步执行一些缓慢或昂贵的过程时,他们暗示你不仅应该异步运行,而且应该在后台线程上运行.目标是释放主线程,以便它可以继续响应用户界面(而不是冻结),因此您可以异步地将任务分派到后台线程.

所以,这有两个部分.首先,以GCD为例,获取一个后台队列(要么获取一个全局后台队列,要么创建自己的):

// one of the global concurrent background queues

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

// or you could create your own serial background queue:
//
// dispatch_queue_t queue = dispatch_queue_create("com.domain.app.queuename", 0);

其次,将任务异步分配到该队列:

dispatch_async(queue, ^{
    // the slow stuff to be done in the background
});

操作队列的模式非常相似.创建操作队列并将操作添加到该队列.

实际上,同步与异步的区别与主队列与后台队列的区别完全不同.但当人们谈论"异步运行一些慢进程"时,他们实际上是在说"在后台队列上异步运行一些慢进程"

Objective-c相关问答推荐

为何在Objective-C中,使用self.propName赋值会导致崩溃而使用_ivarName则不会?

错误无法使 UICollectionElementKindCell 类型的视图出列

禁用手势识别器

MKMapView zoom 到 viewDidLoad 上的用户位置?

当前时间是 HH:MM:SS am/pm 格式吗?

dispatch_get_global_queue 和 dispatch_queue_create 有什么区别?

使用 UIScrollView 用两根手指滚动

不区分大小写的核心数据 CONTAINS 或 BEGINS WITH 约束

主队列上的 dispatch_sync 在单元测试中挂起

如何编写 Objective-C 完成块

Interface Builder 中的 IBOutletCollection 集排序

从我在 iPhone 上的应用程序调用官方 *Settings* 应用程序

iOS 内存分配 - 一个应用程序可以使用多少内存?

使用正则表达式在 Xcode 中查找/替换

iPhone 键盘、完成按钮和 resignFirstResponder

ios 11 UITabBar UITabBarItem 定位问题

从 NSMutableString 中删除最后一个字符

Objective-c - CABasicAnimation 在动画后应用更改?

CMTime 秒输出

iOS中的活动生命周期相当于什么?