关于Run Loops

最近面试过程中,通常一家比较牛逼的公司,一般问的问题不太会问到视图层次的问题。

例如:UIButton的基类是什么?(先想,别着急去点UIButton看基类,肯定不少人不知道)

响应者链的关系,在多个视图层上,如何获取当前的视图的ViewController?

等等等。

也有的公司会大幅度的来问稍微偏低层的,Messageing,runtime等。今天主要分享的是关于Run Loops。

官方:苹果官方文档Run Loops

run:运行,运营

loop:圈,环

两个单词拼起来就是,绕成圈运行,也就是循环运行的意思(虽然很俗,但事实上就是这个意思)。

Run loops are part of the fundamental infrastructure associated with threads. A run loop is an event processing loop that you use to schedule work and coordinate the receipt of incoming events. The purpose of a run loop is to keep your thread busy when there is work to do and put your thread to sleep when there is none.

Run Loops与线程有着密切相关的联系。Run Loops就一个循环处理系统所接受的任务,如果有则先处理,如果没有则进入休眠状态。

接下来,看官方的图。

关于Run Loops

由此图可见,对于处理的事件主要分为两种:一种为输入源,一种为定时器。而输入源主要有以下三种源:

1.perforeSelector源

//在主线程的Run Loop下执行指定的 @selector 方法
performSelectorOnMainThread:withObject:waitUntilDone:
performSelectorOnMainThread:withObject:waitUntilDone:modes:

//在当前线程的Run Loop下执行指定的 @selector 方法
performSelector:onThread:withObject:waitUntilDone:
performSelector:onThread:withObject:waitUntilDone:modes:

//在当前线程的Run Loop下延迟加载指定的 @selector 方法
performSelector:withObject:afterDelay:
performSelector:withObject:afterDelay:inModes:

//取消当前线程的调用
cancelPreviousPerformRequestsWithTarget:
cancelPreviousPerformRequestsWithTarget:selector:object:

2.自定义源 (CFMachPortRef, CFMessagePortRef, or CFSocketRef)来创建源

3.基于端口的源,使用NSPort来创建源。

另外,Run Loops可以通过Observers随时监听Run Loops的动态。

Run Loop Observers

当事件源异步或者同步所触发时,Run Loop Observers则在Run Loop中所触发时所收到的通知:

  • Run Loop进入的时候

  • 当处理一个Timer事件源的时候

  • 当处理一个输入源的时候

  • 当休眠的时候

  • 当唤醒的时候,但是在唤醒它的事件处理之前

  • Run Loop停止的时候

什么时候使用Run Loop?

  • 需要使用Port-Based Input Source或者Custom Input Source和其他线程通讯时


  • 需要在线程中使用Timer

  • 需要在线程中使用selector相关方法

  • 需要让线程执行周期性的工作

如何使用Run Loop

Simple Demo:https://github.com/Guicai-Li/SSRunLoopDemo




你可能感兴趣的:(关于Run Loops)