iOS runloop与定时器的使用

runloop有五种工作模式


其中较为常用的是以下三种

kCFRunLoopDefaultMode--默认模式

UITrackingRunLoopMode--界面跟踪模式

NSRunLoopCommonModes --占位模式


每当用户拖拽界面时,runloop就会由默认模式,进入界面跟踪模式。

所以在设置NSTimer,工作在runloop的mode时要注意实际应用场景。


每种模式下都有如下触发源




定时器是其中一种触发源,所以定时器的使用必须结合runloop工作模式的设置

下面是runloop下使用NSTimer的几种方式

    // 0.没有设置runloop模式的方式
    //    [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(show) userInfo:nil repeats:YES];
    
    // 1.创建NSTimer
    NSTimer *timer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(show) userInfo:nil repeats:YES];
    
    // 2.1.添加到runloop
    // 把定时器添加到当前的runloop中,并选择默认运行模式
    // kCFRunLoopDefaultMode == NSDefaultRunLoopMode
    // 但是这种模式下如果拖拽界面,runloop会自动进入UITrackingMode,优先于定时器追踪模式
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
    
    // 2.2.我们更改一下模式UITrackingRunLoopMode
    // 当runloop的模式是UITrackingRunLoopMode时定时器才工作
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:UITrackingRunLoopMode];
    
    // 2.3.还有一种runloop的mode,占位运行模式
    // 就可以无论是界面追踪还是普通模式都可以运行
    /**
     common modes = <CFBasicHash 0x7fb7424021b0 [0x10f12f7b0]>{type = mutable set, count = 2,
     entries =>
     0 : <CFString 0x11002a270 [0x10f12f7b0]>{contents = "UITrackingRunLoopMode"}
     2 : <CFString 0x10f14fb60 [0x10f12f7b0]>{contents = "kCFRunLoopDefaultMode"}
     */

    /**
     NSTimer的问题,NSTimer是runloop的一个触发源,由于NSTimer是添加到runloop中使用的,所以如果只添加到default模式,会导致拖拽界面的时候runloop进入界面跟踪模式而定时器暂停运行,不拖拽又恢复的问题,这时候就应该使用runloop的NSRunLoopCommonModes模式,能够让定时器在runloop两种模式切换时也不受影响。
     */
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值