博客> NSRunloop学习总结
NSRunloop学习总结
2017-10-18 09:03 评论:0 阅读:323 vastlh
ios NSRunloop
从事iOS开发工作快3年,做的大部分是简单基础的代码编写工作,对于很多平常用到的基础类或者框架却还是一知半解。最近有点闲,特意把那些之前比较迷糊的地方在看看(欢迎各位大神指点)。

首先是NSRunloop。 最基本的理解: 1.runloop就是线程用来处理消息(事件)循环的 2.runloop可以保持线程不退出,在有任务时唤醒,空闲时休眠

最好的文档自然是苹果官方帮助文档。但是关于NSRunloop总体介绍过于简略,不过可以在CFRunloop Refrence(NSRunloop是对CFRunloopRef做了一层OC封装)找到更加详细更加容易理解的描述:

A CFRunLoop object monitors sources of input to a task and dispatches control when they become ready for processing. Examples of input sources might include user input devices, network connections, periodic or time-delayed events, and asynchronous callbacks.
Three types of objects can be monitored by a run loop: sources (CFRunLoopSource Reference), timers (CFRunLoopTimer Reference), and observers (CFRunLoopObserver Reference). To receive callbacks when these objects need processing, you must first place these objects into a run loop with CFRunLoopAddSource, CFRunLoopAddTimer, or CFRunLoopAddObserver. You can later remove an object from the run loop (or invalidate it) to stop receiving its callback.

简单的总结就是,Runloop是用来监听3类对象sources、timers、observers,并且处理它们的回调事件的。

There is exactly one run loop per thread. You neither create nor destroy a thread’s run loop. Core Foundation automatically creates it for you as needed. You obtain the current thread’s run loop with CFRunLoopGetCurrent. Call CFRunLoopRun to run the current thread’s run loop in the default mode until the run loop is stopped with CFRunLoopStop. You can also call CFRunLoopRunInMode to run the current thread’s run loop in a specified mode for a set period of time (or until the run loop is stopped). A run loop can only run if the requested mode has at least one source or timer to monitor.

每个线程都有唯一一个runloop与之对应,不需要我们创建,在启动这个线程的时候系统会自动帮我们创建好,我们只需要通过CFRunLoopGetCurrent([NSRunloop currentRunLoop])获取,然后指定一个RunLoopMode让它开始运行。
这里的RunLoopMode在我理解,就是代表着一堆sources、timers、observers对象的集合,当runloop运行在一个指定mode下时,它就只能处理当前那个mode集合中包含对象触发的事件。同时,我们要让runloop处理某个对象的事件,必须将这个对象添加到一个RunLoopMode中。当一个runloop运行的mode中不包含任何sources、timers或obervers时,它就会自动退出。runloop可以在不同的mode之间进行切换,从而处理不同对象集合的触发事件。
重点理解两个mode:
NSDefaultRunLoopMode
NSRunLoopCommonModes
NSDefaultRunloopMode就是默认mode,大部分情况下,我们都只需要处理这个mode就可以。NSRunLoopCommonModes则是mode的集合(注意s结尾),它不是一个具体的RunloopMode(用苹果的话说它是a special pseudo-mode ,即假模式)。我们可以用CFRunLoopAddCommonMode将一个RunLoopMode添加到NSRunLoopCommonModes集合中。这个mode集合的存在是为了方便我们添加对象到多个mode,即所有我们添加到commonModes的对象(sources、timers、obsevers),都会最终添加到commonModes中包含的所有具体mode中去。
收藏
0
sina weixin mail 回到顶部