RunLoop原理和实践

2018-04-17  本文已影响43人  CoderLF
RunLoop由来
Runloop的作用:
RunLoop与线程的关系
实践

让子线程一直存在;正常情况下子线程执行完任务之后就会被销毁,通过加入循环让子线程一直保存

#pragma mark - 常驻线程
- (void)viewDidLoad {
    [super viewDidLoad];

    // 创建线程,并调用run1方法执行任务
    self.thread = [[NSThread alloc] initWithTarget:self selector:@selector(run1) object:nil];
    // 开启线程
    [self.thread start];    
}

- (void) run1
{
    // 这里写任务
    NSLog(@"----run1-----");

    // 添加下边两句代码,就可以开启RunLoop,之后self.thread就变成了常驻线程,可随时添加任务,并交于RunLoop处理
    [[NSRunLoop currentRunLoop] addPort:[NSPort port] forMode:NSDefaultRunLoopMode];
    [[NSRunLoop currentRunLoop] run];

    // 测试是否开启了RunLoop,如果开启RunLoop,则来不了这里,因为RunLoop开启了循环。
    NSLog(@"未开启RunLoop");
}

tableView延迟加载图片的新思路

- (void)imageViewLoad{

    //ImageView的显示 滑动时不加载 只在NSDefaultRunLoopMode模式下显示图片
    UIImageView *img;
    
    [img performSelector:@selector(setImage:) withObject:[UIImage imageNamed:@"placeholder"] afterDelay:3.0 inModes:@[NSDefaultRunLoopMode]];

}

RunLoop - 在一段时间内每隔一会执行某种任务的线程

//Run Loop 有 [acceptInputForMode:beforeDate:] 和[runMode:beforeDate:]方法来指定在一时间之内运行模式。如果不指定时间,Run Loop默认会运行在Default模式下(不断重复调用runMode:NSDefaultRunLoopMode beforeDate:...) 例如需要在应用启动之后,在一定时间内持续更新某项数据。
-(void)loopEvent{
@autoreleasepool {
    //在30分钟内,每隔30s执行 run 方法
    NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
    NSTimer * udpateTimer = [NSTimer timerWithTimeInterval:30
                                                    target:self
                                                  selector:@selector(run)                                                  userInfo:nil
                                                   repeats:YES];
    [runLoop addTimer:udpateTimer forMode:NSRunLoopCommonModes];
    [runLoop runUntilDate:[NSDate dateWithTimeIntervalSinceNow:60*30]];
}
}
上一篇 下一篇

猜你喜欢

热点阅读