码迷,mamicode.com
首页 > 编程语言 > 详细

单独线程上使用RunLoop开启NSTimer

时间:2015-07-14 13:23:08      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:

//第一步:创建一个新的子线程,为了不阻塞当前线程
- (NSThread *)archiveringThread {
      static NSThread *_thread = nil;
      static dispatch_once_t onceToken;
__weak __typeof(self)weakSelf
= self; dispatch_once(&onceToken, ^{ __strong __typeof(weakSelf)strongSelf = weakSelf; //1. 创建新的NSThread对象 _thread = [[NSThread alloc] initWithTarget:self
                          selector:@selector(threadStartRunMethod:)
                           object:nil]; //2. 注意,一定要start线程对象,否则不执行 [_thread start]; }; return _thread; }

 

// 第二步:在新线程对象的执行函数里面,开启新线程对象的runloop
- (void) threadStartRunMethod:(id)__unused object {
    //注意:这个方法执行是在新的子线程上,并不是当前线程对象
  
    // 设置线程的名字
    NSThread *thread = [NSThread currentThread];
    [thread setName:@"所在新的子线程对象"];

    // 获取当前所在线程对象的runloop
    NSRunloop *runLoop = [NSRunLoop currentRunLoop];
    [runLoop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];

    // 开启runloop,开始接收事件源
    [runLoop run];
}

 

// 第三步:在创建的新线程上,执行startArchiverData方法
- (void)scheduleArchive {
    [self performSelector:@selector(startArchiverData) onThread:[self archiveringThread] withObject:nil waitUntilDone:NO modes:[self.runLoopModes allObjects]];
}

 

// 第四步:在所在的runloop添加NSTimer时间, 一直让runloop处于接收事件源的状态

- (void)startArchiverData {
    //1. 获取当前线程的runloop
    NSRunLoop *loop = [NSRunLoop currentRunLoop];

    //.2 创建NSTimer,指定回调函数doArchiverData
    _archiveringTimer = [NSTimer timerWithTimeInterval:10.f target:self selector:@selector(doArchiverData) userInfo:nil repeats:YES];

    //3. 将NSTimer添加到runloop
    [loop addTimer:_archiveringTimer forMode:NSDefaultRunLoopMode];

    //4. 一直让loop执行timer事件源
    while (YES) {
        [loop runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:2.f]];
    }
}

 

// 第五步:有runloop调度执行NSTimer的回调函数
- (void)doArchiverData {
    NSLog(@"... doArchiverData ... \n");
}

 

单独线程上使用RunLoop开启NSTimer

标签:

原文地址:http://www.cnblogs.com/xiongzenghui/p/4645078.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!