runloop 多线程

好文章链接:https://www.jianshu.com/p/b9426458fcf6

// Runloop 负责1. 监听 2.保证程序不退出

//currentRunLoop 当前线程的 RunLoop

NSTime * timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(timerMethod) userInf:nil repets:YES];

[[NSRunLoop currentRunLoop] addTimer:timer forModel:NSDefaultRunLoopModel];

 

/*

NSDefaultRunLoopModel 默认模式

UITrackingRunLoopModel UI模式

NSRunLoopCommonModes UI&默认

*/

 

- (void)timerMethod

{

 NSLog(@"来了");

}

 

当定时器添加到Tableview上,拖拽时 timer不执行?

 

每隔一秒钟,调用默认模式下 timer ,当runloop被唤醒就执行任务,执行完就去休息,由于UI模式优先级最高,当拖拽时,runloop 只能处理UI模式的拖拽,当拖拽时,默认模式队列里是能接受到每隔一秒钟的请求,但是runloop没办法去执行,因为要执行UI模式

所以把Model改成UI模式即可,拖拽时不影响打印

[[NSRunLoop currentRunLoop] addTimer:timer forModel:UITrackingRunLoopModel ];

但是拖拽停止打印停止,因为UI模式只能被UI事件所唤醒,

所以要在每个模式下添加model

[[NSRunLoop currentRunLoop] addTimer:timer forModel:UITrackingRunLoopModel ];

[[NSRunLoop currentRunLoop] addTimer:timer forModel:NSDefaultRunLoopModel];

最简单的 用 NSRunLoopCommonModes

 

问题来了 ,如果在 timerMethod中有耗时操作,那么拖拽时会卡顿,所以把 timer 添加在子线程中

 

while(true) 是无用代码

如果不加 [[NSRunLoop currentRunLoop] run]; 就不执行 timerMethod 因为 thread 是局部变量,执行完viewdidload就释放了

如果在子线程中加timer 必须在子线程开启,才会执行,因为主线程在创建时会自动创建主线程的runloop所以在主线程中创建runloop不用手动开启

 

主线程------------------

UIKit框架是线程不安全的

主线程也就是UI线程,所以UI刷新都是在主线程

runloop就相当于线程对外界提供的接口,让外部去调用,runLoop处理的任务叫事件

苹果没有给穿件runloop接口,但苹果自己是创建runloop,在第一次获取时穿件 eg:currentRunLoop

 

-----------------------------------------------------------------------------------------------------

------------------------- source -------------------

苹果官方解释

按照函数调用栈 Source 的分类分为 Source0 和 Source1(系统内核事件 source0 跟1 相反)

上边截图有_CFRunLoopDoSource0

用GCD创建线程主要就是 创建Source

 

----------------------------------------------------------------------

----------- 给runloop添加观察者 --------------

NSMutableArray 是一个指针 指向一块堆区域,堆区域,里有一个指针指向另一块内存,这个另一块内存就是存储数据的堆内存

上边截图是 通过observer 做tableview优化

下边是部分代码,加载大图多图,模拟出 网页模块化加载

 

视频名字 1月27日--Runloop

有关性能优化视频,视频里有检测内存泄漏以及定位到泄漏位置

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值