【问题标题】:what is the difference between sync and async input source for run loops?运行循环的同步和异步输入源有什么区别?
【发布时间】:2020-02-13 11:24:40
【问题描述】:

端口等输入源将事件异步传递到运行循环,而计时器同步传递事件是什么意思。

定时器是否阻塞线程?

【问题讨论】:

    标签: ios foundation


    【解决方案1】:

    Threading Programming Guide: Run Loops 说:

    一个运行循环从两种不同类型的源接收事件。 输入源 传递异步事件,通常是来自另一个线程或来自不同应用程序的消息。 定时器源传递同步事件,在预定时间或重复间隔发生。两种类型的源都使用特定于应用程序的处理程序例程在事件到达时对其进行处理。

    但是定时器只会在定时器的闭包或选择器方法运行时阻塞线程。但是一旦你从那里返回,线程就不再被阻塞。所以一定要尽快进出。

    例如,如果您安排了一个计时器在 10 秒内触发,并且计时器的处理闭包/选择器中的代码需要 100 毫秒才能运行,那么线程不会被阻塞,直到计时器触发,然后仅 100毫秒。与重复计时器相同。

    归根结底,只要您没有在计时器处理程序中做任何计算量太大的事情,就没有什么可担心的。如果你确实需要做任何可能阻塞任何实质性时间的事情,那么要么让你的计时器处理程序异步地将相关代码分派到某个后台队列,或者只是安排一个 GCD 计时器直接在后台队列上运行,绕过 @ 987654322@一共。

    但对于大多数 Timer 用例来说,这不是问题。

    【讨论】:

    • 感谢您的发现,至于自定义输入(例如选择器)的异步处理程序,它们会重新安排到以后的运行循环吗?
    • 完成处理程序(无论是块还是选择器)的整个想法是它们是异步的,根据定义是非阻塞的,在相关事件发生之前不会被调用。它们是由 runloop 还是 GCD 处理会有所不同,但这是我们通常不担心的实现细节。我们正是使用这些异步模式来避免阻塞。
    猜你喜欢
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    • 2016-03-17
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    相关资源
    最近更新 更多