在子线程中使用runloop,正确使用NSTimer

转载自:http://www.jianshu.com/p/36ba6299268f

 

1.在子线程中进行NSTimer的操作,再在主线程中修改UI界面。

(1)


 

(2)使用GCD,同样也是多线程

声明全局成员变量

dispatch_source_t _timers;


 

2.仍然在主线程中进行NSTimer操作,但是将NSimer实例加到mainRunLoop的特定mode中,避免被复杂的操作或者UI界面的刷新所干扰。


 

总结:

每一个线程都有一个实际已经存在的runloop。比如我们的主线程,在主函数的UIApplication中


 

系统就为我们将主线程的main runloop隐式的启动了。runloop顾名思义就是一个循环,他不停的运行,从程勋开始到程序退出。正是由于这个“循环”在不停的监听各种事件,程序才能有能力检测到用户的各种触摸交互、网络返回的数据才会诶检测到、定时器才会在预定的事件触发操作。

runloop只接受两种任务:输入源和定时源。文中说的是定时源。在默认的状态下,子线程的runloop中没有加入我们自己的源,那么我们在子线程中使用自己的定时器时,就需要自己加到runloop中,并启动该子线程的runloop,这样才能正确的运行定时器。

 

额外:当主线程在处理一些滑动操作是,会暂停定时器中的动作,通过修改mode,防住 主线程滑动等事件阻碍了定时器中的事件;

timer = [NSTimer timerWithTimeInterval:5.0 target:self selector:@selector(SendHeartBeat) userInfo:nil repeats:YES];
 [[NSRunLoop mainRunLoop] addTimer:heartTimer forMode:NSRunLoopCommonModes];

 

posted on 2016-09-21 17:05  lolDragon  阅读(793)  评论(0编辑  收藏  举报

导航