iOS NSTimer 子线程 创建与取消
来源:互联网 发布:dota视频站软件 编辑:程序博客网 时间:2024/06/06 08:44
1.子线程中NSTimer的开启
首先在.m文件中声明两个属性一个是子线程 一个是子线程中的NSTimer。
@property (nonatomic, strong) NSThread *thread1;@property (nonatomic, strong) NSTimer *threadTimer;
然后用GCD在全局全队中创建一个子线程并创建NSTimer。
__weak __typeof(self) weakSelf = self; dispatch_async(dispatch_get_global_queue(0, 0), ^{ __strong __typeof(weakSelf) strongSelf = weakSelf; if (strongSelf) { strongSelf.thread1 = [NSThread currentThread]; [strongSelf.thread1 setName:@"线程A"]; strongSelf.threadTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:strongSelf selector:@selector(timerAction) userInfo:nil repeats:YES]; NSRunLoop *runloop = [NSRunLoop currentRunLoop]; [runloop addTimer:strongSelf.threadTimer forMode:NSDefaultRunLoopMode]; [runloop run]; } });
注意的是:在子线程中创建的NSTimer需要加入到对应线程的RunLoop中。RunLoop中常用的mode有:NSDefaultRunLoopMode、UITrackingRunLoopMode和NSRunLoopCommonModes三种模式。
NSDefaultRunLoop 默认模式
UITrackingRunLoop 界面追踪,用于scrollView拖拽 滑动
NSRunLoopCommonModes 不是一个特定的模式,只是一种标记,比较综合的一种模式(包含 前两种模式)
在NSTimer加入RunLoop后,需要将RunLoop运行起来。
2.子线程中NSTimer的关闭
之后创建一个cancelTimer的方法
- (void)cancel{if (self.threadTimer) {[self.threadTimer invalidate];self.threadTimer = nil;}}
如果这个方法跟创建NSTimer不在同一个线程执行是无法将Timer 执行invalidate操作的。
然后现在我们需要在thread1这个线程中执行这个操作,在这里写一个方法用于在子线程中调用此方法。
- (void)cancelTimer{if (self.threadTimer && self.thread1) {[self performSelector:@selector(cancel) onThread:self.thread1 withObject:nil waitUntilDone:YES];}}
最后我们在有需要关闭Timer的地方执行此方法即可。
在这里说明一下为什么NSTimer要在同一个线程中创建和关闭。因为创建的Timer的时候已经把Timer加入到该线程对应的RunLoop中,这个RunLoop设置了这个Timer为一个事件。因此要在同一个线程中才能cancel这个Timer。
0 0
- iOS NSTimer 子线程 创建与取消
- 线程的创建与取消
- IOS 在子线程运行performSelector和NSTimer
- iOS 创建子线程方法
- Posix线程编程指南(1)---线程创建与取消
- Posix线程编程指南(1)---线程创建与取消
- Posix线程编程指南(1)--线程创建与取消
- iOS多线程的初步研究(四、五、六)--NSTimer--NSURLConnection子线程中运行 ---- NSOperation
- ios NSTimer与保留环
- 线程取消与清理
- IOS中NSTimer消除线程阻塞问题
- iOS线程休眠及取消
- IOS 线程处理 子线程的启动与结束
- POSIX线程的创建与取消—pthreads线程库实例笔记1
- NSTimer和NSRunLoop在子线程中的使用
- NSTimer和NSRunLoop在子线程中的使用
- windows 创建子线程
- VC创建子线程
- 用Fiddler或Charles进行mock数据搭建测试环境
- 用Word 写csdn博客
- vector中的resize()和reserve()
- SQL语句练习
- android群英传笔记 android apk应用信息获取
- iOS NSTimer 子线程 创建与取消
- dos 小命令
- MaxCompute 中的Code Generation技术简介
- SAP 物料编码更改标准解决方案
- 自动弹出数字键盘 EditText(Android) UITextField(iOS)
- python中获取指定目录下所有文件名列表的程序
- JavaScript for Kids 学习笔记12. Canvas
- java数据结构-哈希函数的构造方法
- git命令