iOS学习首页投稿(暂停使用,暂停投稿)iOS Developer

RunLoop使用方法

2017-07-05  本文已影响189人  CoderLWG

RunLoop使用方法

 - (void)viewDidLoad {
    [super viewDidLoad];
    
    self.thread = [[NSThread alloc] initWithTarget:self selector:@selector(execute) object:nil];
    [self.thread start];
    
}
    
- (void)run
{
    NSLog(@"----------run----%@", [NSThread currentThread]);
    
    // 需要向runloop中加入timer/source(Port)/observer等runloop才不会退出
    [[NSRunLoop currentRunLoop] addPort:[NSPort port] forMode:NSDefaultRunLoopMode];
    [[NSRunLoop currentRunLoop] run];
}
// 调用该方法随时可以进入runloop执行操作
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self performSelector:@selector(test) onThread:self.thread withObject:nil waitUntilDone:NO];
}

// 此方法也可以保持runloop
- (void)execute
{
    // scheduledTimer这个方法把timer直接加进runloop了,不需要手动添加
    [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(test) userInfo:nil repeats:YES];
    [[NSRunLoop currentRunLoop] run];
    
    // 此种方法需要自己添加到runloop中启动
    NSTimer *timer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:YES];
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
    [[NSRunLoop currentRunLoop] run];

}

- (void)timer {
    
    //调用scheduledTimer返回的定时器,已经自动被添加到当前runloop中,而且是NSDefaultRunLoopMode
//    [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:YES];
    
    NSTimer *timer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:YES];
    
    //定时器只运行在NSDefaultRunLoopMode下,一旦RunLoop进入其他模式,这个定时器就不会工作
    //[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
    
    //定时器只运行在UITrackingRunLoopMode下,一旦RunLoop进入其他模式,这个定时器就不会工作
    //[[NSRunLoop currentRunLoop] addTimer:timer forMode:UITrackingRunLoopMode];
    
    //定时器在NSRunLoopCommonModes下,两种模式下都可以工作
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
}

- (void)observer{
    
    //添加observer
    /*
     activity的状态值
     kCFRunLoopEntry = (1UL << 0), 1 即将进入runloop
     kCFRunLoopBeforeTimers = (1UL << 1), 2 即将处理timer
     kCFRunLoopBeforeSources = (1UL << 2), 4 即将处理Source
     kCFRunLoopBeforeWaiting = (1UL << 5), 32 即将进入休眠
     kCFRunLoopAfterWaiting = (1UL << 6),  64  刚从休眠中唤醒
     kCFRunLoopExit = (1UL << 7),           128 即将退出runloop
     kCFRunLoopAllActivities = 0x0FFFFFFFU
     可以监听按钮点击之前的时间
     */
    CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler(CFAllocatorGetDefault(), kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {
        NSLog(@"-----监听到runloop状态发生改变%zd",activity);
    });
    
    
    // 添加观察者,监听Runloop的状态
    CFRunLoopAddObserver(CFRunLoopGetCurrent(), observer, kCFRunLoopDefaultMode);
    
    // 释放observer
    CFRelease(observer);
    
    /*
     CF的内存管理
     1.凡是带有create、copy、retain等字眼的函数,创建出来的对象 最后要做一次release
     2、release函数,CFRelease(observer)
     
     */
    
}


RunLoop面试题

上一篇 下一篇

猜你喜欢

热点阅读