我对异步加载和主线程的概念有点混淆。当异步加载某些东西时,它是否意味着它不在主线程上运行?据我所知这是两个不同的概念,可以在主线程上异步运行某些东西,也可以异步在后台/辅助线程上运行。如果我错了,请纠正我。
答案 0 :(得分:6)
不完全。异步运行意味着它不会停止执行继续当前线程。这是一个重要的区别,因为它完全可以异步执行某些操作,使其最终出现在主线程上(例如:dispatch_async(dispatch_get_main_queue(),^ {some block});),这意味着它不会停止其他一些线程继续,但阻止主线程。
因为主线程对应用程序非常重要,所以异步代码最常见的 use 是为了避免阻塞它,但它并不是唯一的用途。
(编辑添加)
或许,用“与x相关的异步”来考虑它更有用。如果您这样做,例如:
dispatch_async(aSerialQueue, ^{
work();
work();
});
然后,两个工作调用是相互同步的,并且与aSerialQueue上的所有其他工作同步,但是对于其他所有工作都是异步的。
答案 1 :(得分:2)
异步运行某些操作只是意味着调用可能在任务完成之前返回。这可能是因为它在后台线程上运行。可能是因为它会在当前线程中发生。
同步运行并不意味着它会在主线程上发生;这意味着在任务完成之前调用不会返回。这可能是因为它发生在同一个线程上。这可能是因为它发生在另一个线程上,但您希望当前线程等待另一个线程完成。
此外,请注意主线程与当前线程之间存在差异。在后台线程上调用的同步任务将使后台线程继续前进,直到任务完成,但根本不会阻塞主线程。
当然,大多数情况下在iOS中,您的代码将在主线程上运行。但是你可以将工作推送到后台线程(例如使用dispatch
API),因此区别很重要。
答案 2 :(得分:0)
主线程是执行大量代码的地方,包括所有UI。还有其他线程,如Web线程和网络线程,您可以创建自己的线程。
同步与异步是您的代码执行的时间问题。您可以在主线程或任何其他线程上执行同步或异步代码块。如果它是同步的,它将阻塞线程的其余部分直到它完成。如果它是异步的,只要线程从当前正在执行的任何内容中释放出来,它就会运行。