什么东西异步运行是否意味着它不在主线程上?

时间:2013-02-07 23:29:41

标签: iphone ios objective-c ipad

我对异步加载和主线程的概念有点混淆。当异步加载某些东西时,它是否意味着它不在主线程上运行?据我所知这是两个不同的概念,可以在主线程上异步运行某些东西,也可以异步在后台/辅助线程上运行。如果我错了,请纠正我。

3 个答案:

答案 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线程和网络线程,您可以创建自己的线程。

同步与异步是您的代码执行的时间问题。您可以在主线程或任何其他线程上执行同步或异步代码块。如果它是同步的,它将阻塞线程的其余部分直到它完成。如果它是异步的,只要线程从当前正在执行的任何内容中释放出来,它就会运行。