在很长一段时间里,我认为异步是在后台线程上运行某个东西的同义词,而同步是在主线程上运行(阻止UI更新和交互).我知道不在主线程上运行昂贵的操作是因为它不允许在主线程被占用时执行UI操作,但是为什么同步会很麻烦呢?
然而,我注意到,可以在主线程上进行异步调用,在后台线程上进行同步调用.
我经常听到人们说不要同步或在主线程上使用昂贵的调用,因为这会阻塞用户的UI.这两个问题是我应该确保不做的吗?有什么区别?
在很长一段时间里,我认为异步是在后台线程上运行某个东西的同义词,而同步是在主线程上运行(阻止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
});
操作队列的模式非常相似.创建操作队列并将操作添加到该队列.
实际上,同步与异步的区别与主队列与后台队列的区别完全不同.但当人们谈论"异步运行一些慢进程"时,他们实际上是在说"在后台队列上异步运行一些慢进程"