runloop简单介绍及使用技巧

来源:互联网 发布:淘宝创立于哪一年 编辑:程序博客网 时间:2024/06/14 15:29

一、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
原创粉丝点击