繁体   English   中英

当某些东西异步运行时,是否意味着它不在主线程上?

[英]when something is run asynchronously does it mean that it's not on the main thread?

我对异步加载和主线程的概念有些困惑。 当某些内容异步加载时,是否表示它不在主线程上运行? 据我所知,这是两个不同的概念,某些内容可以异步在主线程上运行,某些内容也可以异步在后台/辅助线程上运行。 如果我错了,请纠正我。

不完全的。 异步运行意味着它不会停止在当前线程上继续执行。 这是一个重要的区别,因为完全有可能异步执行某项操作,使其最终结束在主线程上(例如:dispatch_async(dispatch_get_main_queue(),^ {some block});),这意味着它不会停止其他操作线程继续执行,但阻塞了主线程。

因为主线程对应用程序非常重要,所以异步代码最常见的用法是避免阻塞它,但这不是唯一的用法。

(已添加)

也许用“关于x的异步”来思考它会更有用。 如果执行此操作,例如:

dispatch_async(aSerialQueue, ^{
    work();
    work();
});

然后,工作的两个调用相对于彼此是同步的,并且相对于aSerialQueue上的所有其他工作都是同步的,而相对于其他所有事物都是异步的。

异步运行某些东西只是意味着调用可能在任务完成之前返回。 这可能是因为它在后台线程上运行。 可能是因为它将稍后在当前线程上发生。

同步运行某些内容并不意味着它将在主线程上发生。 这意味着直到任务完成,呼叫才会返回。 那可能是因为它发生在同一线程上。 可能是因为它发生在另一个线程上,但是您希望当前线程等待另一个线程完成。

此外,请注意, 线程和当前线程之间存在差异。 在后台线程上调用的同步任务将阻止该后台线程继续运行,直到任务完成为止,但完全不会阻塞主线程。

当然,大多数时候,在iOS中,您的代码将在主线程上运行。 但是您可以将工作推送到后台线程上(例如,使用dispatch API),因此区别很重要。

主线程是执行大部分代码(包括所有UI)的位置。 还有其他线程,例如Web线程和网络线程,您可以创建自己的线程。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM