Runloop学习笔记

作者: 会编程的男神俊 | 来源:发表于2018-01-10 20:10 被阅读73次

此文仅为观后笔记!!!地址:http://v.youku.com/v_show/id_XODgxODkzODI0.html

Why Runloops ?

  • 是程序一直运行并接受用户输入;
  • 决定程序在何时应该处理哪些Event(事件);
  • 调用解耦(Message Queue);
  • 节省CPU时间

Runloops in Cocoa

Runloops in Cocoa
跟Runloop相关的东西
NSTimer、UIEvent、Autorelease、NSObject+NSDelayedPerforming、NSObject+NSThreadPerformAddition、CADisplayLink、CATransition、CAAnimation、dispatch_get_main_queue()、NSURLConnection

Runloop Callouts

6个调起函数

Runloop机制

runloop构成元素简图

RunloopTimer的封装

+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti invocation:(NSInvocation *)invocation repeats:(BOOL)yesOrNo;
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti invocation:(NSInvocation *)invocation repeats:(BOOL)yesOrNo;

+ (CADisplayLink *)displayLinkWithTarget:(id)target selector:(SEL)see;
- (void)addToRunLoop:(NSRunLoop *)runloop forMode:(NSRunLoopMode)mode;
.......

CFRunloopSource

  • source是Runloop的数据源抽象类(protocol);
  • Runloop定义了两个Version的Source:

    Source0:处理APP内部事件、APP自己负责管理(触发),如UIEvent、CFSocket;
    Source1:由Runloop和内核管理,mach port驱动,如:CFMachPort、CFMessagePort

  • 如有需要,可从中选择一种来实现自己的Source;
  • 当然基本不会出现上一条。

CFRunloopObserver

向外部报告Runloop当前状态的更改,框架中很多机制都由RunloopObserver触发,比如:CAAnimation

typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) {
    kCFRunLoopEntry = (1UL << 0),
    kCFRunLoopBeforeTimers = (1UL << 1),
    kCFRunLoopBeforeSources = (1UL << 2),
    kCFRunLoopBeforeWaiting = (1UL << 5),
    kCFRunLoopAfterWaiting = (1UL << 6),
    kCFRunLoopExit = (1UL << 7),
    kCFRunLoopAllActivities = 0x0FFFFFFFU
};
RunloopObserver与Autorelease Pool

UIKit通过RunloopObserver在Runloop两次Sleep减对AutoReleasePool进行Pop和Push,将这次Loop中产生的Autorelease对象释放。

CFRunLoopMode

  • Runloop在同一时间只能且必须在一种特定Mode下跑;
  • 更换Mode时,需要停止当前Loop,然后重启新Loop;
  • Mode是iOS App滑动顺畅的关键;
  • 可以自定义Mode(基本用不到)。
NSDefaultRunloopMode:默认状态,空闲状态。
UITrackingRunLoopMode:滑动ScrollView时,若想保证Timer不被ScrollView影响,则需添加到NSRunLoopCommonModes。
UIInitializationRunLoopMode:私有,App启动时。
NSRunLoopCommonModes:Mode集合

RunLoop与dispatch_get_main_queue()

GCD中dispatch到main queue的block被分发到main RunLoop执行。

RunLoop的挂起与唤醒

  • 指定用于唤醒的mach_port端口
  • 调用mach_msg监听唤醒端口,被唤醒前,系统内核将这个线程挂起,停留在mach_msg_trap状态;
  • 有另一个线程(或另一个进程中的某个线程)向内核发送这个端口的msg后,trap状态呗唤醒,RunLoop继续开始干活。


    伪代码

RunLoop实践

AFNetworking中RunLoop的创建

AFNetworking中RunLoop的创建

UITableView延迟加载图片的新思路

UITableView延迟加载图片

让Crash的App回光返照

接到Crash的Singal后手动重启RunLoop

Async Test Case

RunLoop sleep前验证

RunLoop源码

地址:https://opensource.apple.com/source/CF/CF-855.17/CFRunLoop.c.auto.html

相关文章

  • RunLoop学习笔记

    本文我主要是学习如下文章做的记录,同时还有其他优秀的文章没有粘贴出来,在这里均表示感谢。iOS RunLoop入门...

  • RunLoop学习笔记

    知识点 RunLoop 实际上就是一个对象,这个对象管理了其需要处理的事件和消息,并提供了一个入口函数来执行 Ev...

  • Runloop学习笔记

    此文仅为观后笔记!!!地址:http://v.youku.com/v_show/id_XODgxODkzODI0....

  • RunLoop学习笔记

    读这篇Blog:https://blog.ibireme.com/2015/05/18/runloop/ 学习过程...

  • RunLoop学习笔记

    深入理解RunLoop 技术点: 如何管理事件/消息 没有处理消息时休眠以避免资源占用 有消息到来时立刻被唤醒 实...

  • RunLoop学习笔记

    一般来讲,一个线程一次只能执行一个任务,执行完任务后线程就会退出。如果我们需要线程随时处理任务而不退出,通常的代码...

  • RunLoop学习笔记

    什么是runloop? 一般来讲,一个线程一次只能执行一个任务,执行完成后线程就会退出。如果我们需要一个机制,让线...

  • RunLoop学习笔记

    一.主线程RunLoop:保证App不退出 负责监听所有的事件(触摸事件)(网络事件)(定时器事件)无事件 Run...

  • RunLoop学习笔记

    参考深入理解RunLoop深入研究 Runloop 与线程保活RunLoop分享by孙源 RunLoop的概念 R...

  • RunLoop学习笔记

    在iOS开发中,会经常用到RunLoop,面试的时候更是必问的东西,RunLoop也是iOS中非常重要的东西,趁着...

网友评论

    本文标题:Runloop学习笔记

    本文链接:https://www.haomeiwen.com/subject/tumonxtx.html