在很长一段时间里,我认为异步是在后台线程上运行某些东西的同义词,而同步是在主线程上运行的同义词(阻止 UI 更新和交互)。我理解不运行在主线程上进行昂贵的操作是因为它不允许在主线程被占用时发生 UI 操作,但是为什么同步很麻烦呢?
不过,我注意到您可以在主线程上进行异步调用,并在后台线程上进行同步调用。
我总是听到人们说不要同步或在主线程上使用昂贵的调用,因为它会阻塞用户的 UI。这两个独立的问题是我应该确保我不做的吗?有什么区别?
最佳答案
当您同步调用某些东西时,这意味着启动该操作的线程将等待任务完成后再继续。异步意味着它不会等待。
话虽如此,当人们建议您异步执行一些缓慢或昂贵的进程时,他们暗示您不仅应该异步运行它,而且应该在后台线程上执行此操作。目标是释放主线程,以便它可以继续响应用户界面(而不是卡住),因此您将任务异步分派(dispatch)到后台线程。
所以,有两个部分。首先,以 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)到该队列:
dispatch_async(queue, ^{
// the slow stuff to be done in the background
});
操作队列的模式非常相似。创建一个操作队列并向该队列添加操作。
实际上,同步与异步的区别与主队列与后台队列的区别完全不同。但是当人们谈论“异步运行一些慢速进程”时,他们实际上是在说“在后台队列上异步运行一些慢速进程”。
关于ios - Objective-C 中的同步和异步调用与多线程有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21122842/