多线程与NSTimer

1.Ios主线程,也称UI线程,在主线程中使用NSTimer,runloop是自动开启的,(如果NSTimer当前所处的线程正在进行大数据处理(假设为一个大循环),NSTimer本次执行会等到这个大数据处理完毕之后才会继续执行(类似操作列表的滑动过程,定时器不会),所以用NSRunLoopCommonModes模式,而NSDefaultRunLoopMode不可行)。

在主线程中调用

NSTimer *timer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(timer_callback) userInfo:nil repeats:YES];

使用NSRunLoopCommonModes模式,把timer加入到当前Run Loop中。

[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

2.在子线程中(NSThread开辟新的子线程),使用计时器时,需要[[NSRunLoop currentRunLoop] run],(如果NSTimer当前所处的线程正在进行大数据处理(假设为一个大循环),(类似操作列表的滑动过程)使用NSDefaultRunLoopMode模式NSTimer会正常的运行。

创建并执行新的线程

NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(newThread) object:nil];

  [thread start];

-(void)newThread

{

@autoreleasepool {

NSTimer *timer= [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(timer_callback) userInfo:nil repeats:YES];

[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];

[[NSRunLoop currentRunLoop] run];

}

}

3.GCD使用定时器

//3.GCD中的Timer

uint64_t interval = 2*NSEC_PER_SEC;

dispatch_queue_t queue = dispatch_queue_create("my queue",0);

//创建Timer

_timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);

dispatch_source_set_timer(_timer, dispatch_time(DISPATCH_TIME_NOW, 0), interval, 0);

dispatch_source_set_event_handler(_timer, ^{

NSLog(@"滑动时,是否走此方法");

});

dispatch_resume(_timer);

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏腾讯IVWEB团队的专栏

WebRTC 点对点直播

WebRTC 全称为:Web Real-Time Communication。它是为了解决 Web 端无法捕获音视频的能力,并且提供了 peer-to-peer...

3.7K0
来自专栏冰霜之地

ReactiveCocoa 中 RACCommand 底层实现分析

在ReactiveCocoa 过程中,除去RACSignal和RACSubject这些信号类以外,有些时候我们可能还需要封装一些固定的操作集合。这些操作集合都是...

782
来自专栏每日一篇技术文章

Foundation-RunLoop

642
来自专栏MelonTeam专栏

一个创建自定义事件源的例子

上一篇文章我们介绍了RunLoop的相关知识,但是毕竟我们实际开发中很少应用,今天我们就通过介绍RunLoop在iOS系统中的应用,来实现一个小小的demo,启...

26910
来自专栏MelonTeam专栏

iOS RunLoop的介绍

导语 一道题引出的对RunLoop的认知。 最近做到一道有关 runloop 的选择题,题目大概是这样的: 关于 Runloop 的说法中,哪些是...

24610
来自专栏進无尽的文章

NSRunLoop-iOS中隐藏的大杀器

NSRunLoop和CFRunLoopRef都代表着RunLoop对象.NSRunLoop是基于CFRunLoopRef的一层OC包装.

551
来自专栏一“技”之长

iOS中RunLoop机制浅探 原

        RunLoop这个家伙在iOS开发中,我们一直在用,却从未注意过他,甚至都不从见过他的面孔,那个这个神秘的家伙究竟是做什么的?首先,我们先来观察...

763
来自专栏iOS技术杂谈

iOS多线程——RunLoop与GCD、AutoreleasePool你要知道的iOS多线程NSThread、GCD、NSOperation、RunLoop都在这里

你要知道的iOS多线程NSThread、GCD、NSOperation、RunLoop都在这里 转载请注明出处 https://cloud.tencent.co...

35511
来自专栏iOS 开发杂谈

浅谈 NSTimer 是否精确?

NSTimer 的启动依赖 RunLoop,如果在主线程中做了耗时的操作,当前 RunLoop 持续的时间超过了定时器的间隔时间,那么下一次定时就被延后了。

852
来自专栏iOS技术

iOS多线程应用(三):NSOperation

NSOperation是基于GCD的面向对象封装,在各大开源库里面我们常常看到它的身影。它的使用很简单易懂,基本上你点进Api就会用了,本文就最常用的功能进行讲...

30811

扫码关注云+社区