runloop简单介绍及使用技巧

一、RunLoop定义

当有持续的异步任务需求时,我们会创建一个独立的生命周期可控的线程。RunLoop就是控制线程生命周期并接受事件进行处理的机制。

RunLoop是iOS事件响应与任务处理最核心的机制,它贯穿于整个iOS系统。

二、RunLoop目的

通过RunLoop机制实现省电,流畅,响应速度快,用户体验好

三、RunLoop特性

1.主线程的RunLoop在应用启动时就会自动创建,其他线程需要在该线程下自己启动,不能自己创建RunLoop

四、RunLoopModes

1.NSDefaultRunLoopMode:默认模式

2.NSConnectionReplyMode:用来监听网络请求NSConnection的事件

3.NSModalPanelRunLoopMode:OS X的Modal面板事件

4.UITrackingRunLoopMode:拖动事件

5.NSRunLoopCommonModes:是一个模式集合

五、RunLoop应用

(1)在主线程启动一个定时器Timer,然后拖动UItableview或UIScrollView,计时器不执行。只是因为为了更好的用户体验,在主线程中event tracking模式优先级最高。在用户拖动控件时,主线程的RunLoop是运行在evevt tracking mode下,而创建的Timer是默认关联的Default Mode,因此系统不会立即执行Default Mode下接收的事件。解决方法:

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timeAction) userInfo:nil repeats:YES];
    [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
//    [[NSRunLoop currentRunLoop] addTimer:timer forMode:UITrackingRunLoopMode];
(2)维护线程的生命周期,让线程不自动退出,isFinished为YES时退出

<span style="font-size:14px;">[[NSRunLoop currentRunLoop] addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];
    while (!self.isCancelled && !self.isFinished) {
        @autoreleasepool {
            [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:3]];
        }
    }</span>

(3)AFNetworking中创建一个常驻线程

+ (void)networkRequestThreadEntryPoint:(id)__unused object {
    @autoreleasepool {
        [[NSThread currentThread] setName:@"AFNetworking"];
        //这里主要是监听某个port,目的是让这个thread不会回收,即常驻线程
        NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
        [runLoop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];
        [runLoop run];
    }
}

+ (NSThread *)networkRequestThread {
    static NSThread *_networkRequestThread = nil;
    static dispatch_once_t oncePredicate;
    dispatch_once(&oncePredicate, ^{
        
        _networkRequestThread = [[NSThread alloc] initWithTarget:self selector:@selector(networkRequestThreadEntryPoint:) object:nil];
        [_networkRequestThread start];
    });
    return _networkRequestThread;
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值