RunLoop 学习

RunLoop概念:控制线程生命周期并接收事件进行处理的机制。


通过RunLoop解决如scrollerView或TableView之类的滑动拖动事件 导致timer暂停的问题。

[[NSRunLoop mainRunLoop]addTimer:_timer forMode:NSRunLoopCommonModes]


特别注意:RunLoop的每个循环必须加上@autoReleasePool 用于释放每个循环结束后蜀不需要的内存


cocoa 定义的四种mode

1.Default:NSDefaultRunLoopMode (Cocoa) kCFRunLoopDefaultMode (Core Foundation),默认的模式,在Run Loop没有指定Mode的时候,默认就跑在Default Mode下

2.Connection:NSConnectionReplyMode (Cocoa),用来监听处理网络请求NSConnection的事件;

3.Event tracking:UITrackingRunLoopMode(iOS) NSEventTrackingRunLoopMode (Cocoa),用户鼠标触碰的拖动事件;

4.Common modes:NSRunLoopCommonModes (Cocoa) kCFRunLoopCommonModes (Core Foundation)。


可以配置的通用模式(通过方法CFRunLoopAddCommonMode来配置添加其他需要支持的模式),在Cocoa中,默认包含了Default、Modal和Event tracking的模式,而在Core Foundation中,只包含了Default模式;


RunLoop主要应用到的三个场景:

1.维护线程生命周期

目的:维护线程生命周期 不让线程自动退出

可通过调用【thread cancel】或者 在 isFinished 里返回YES来退出线程。


2.长驻线程,用于执行预期会一直存在的任

例如:创建一个线程,生命周期和APP一样,当线程启动后 无法通过【thread cancel】来退出线程 甚至【removePort:forMode]】也无法保证RunLoop会退出

创建方法:NSRunLoop * runLoop =【NSRunLoop currentRunLoop】

【runLoop addport【NSMachPort port】forMode:NSRunLoopDefaultModes】


3.在一定时间内监听某种事件 或执行某种任务的线程

例如:在30分钟内,没隔30S执行一个方法 如:reloadView


-(void)main{

@autoReleasePool{

               NSRunLoop *runLoop = [NSRunLoop currentRunLoop];

               NSTimer * timer = [NStimer timerWithTimeInterval:30
                                                        target:self
                                                      selector:@selector(reloadView:)
                                                      userInfo:nil
                                                       repeats:YES];

              [runLoop addtimer:timer forMode:NSRunLoopCommonModes];

              [runLoop runUntilData:[NSData dataWithTimeIntervalSinceNow:60 * 30]]

}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值