iOS开发-RunLoop的退出方式
来源:互联网 发布:linux 安装 jdk 编辑:程序博客网 时间:2024/06/05 19:17
一. 三种启动RunLoop的方式
通过[NSRunLoop currentRunLoop]或者CFRunLoopGetCurrent()可以获取当前线程的runloop。
启动一个runloop有以下三种方法:
- (void)run; - (void)runUntilDate:(NSDate *)limitDate;- (void)runMode:(NSString *)mode beforeDate:(NSDate *)limitDate;
这三种方式无论通过哪一种方式启动runloop,如果没有一个输入源或者timer附加于runloop上,runloop就会立刻退出。
(1) 第一种方式,runloop会一直运行下去,在此期间会处理来自输入源的数据,并且会在NSDefaultRunLoopMode模式下重复调用runMode:beforeDate:方法;
(2) 第二种方式,可以设置超时时间,在超时时间到达之前,runloop会一直运行,在此期间runloop会处理来自输入源的数据,并且也会在NSDefaultRunLoopMode模式下重复调用runMode:beforeDate:方法;
(3) 第三种方式,runloop会运行一次,超时时间到达或者第一个input source被处理,则runloop就会退出。
前两种启动方式会重复调用runMode:beforeDate:方法。
二. 退出RunLoop的方式
第一种启动方式的退出方法
文档说,如果想退出runloop,不应该使用第一种启动方式来启动runloop。
如果runloop没有input sources或者附加的timer,runloop就会退出。
虽然这样可以将runloop退出,但是苹果并不建议我们这么做,因为系统内部有可能会在当前线程的runloop中添加一些输入源,所以通过手动移除input source或者timer这种方式,并不能保证runloop一定会退出。
第二种启动方式runUntilDate:
可以通过设置超时时间来退出runloop。
第三种启动方式runMode:beforeDate:
通过这种方式启动,runloop会运行一次,当超时时间到达或者第一个输入源被处理,runloop就会退出。
如果我们想控制runloop的退出时机,而不是在处理完一个输入源事件之后就退出,那么就要重复调用runMode:beforeDate:,
具体可以参考苹果文档给出的方案,如下:
NSRunLoop *myLoop = [NSRunLoop currentRunLoop]; myPort = (NSMachPort *)[NSMachPort port]; [myLoop addPort:_port forMode:NSDefaultRunLoopMode];BOOL isLoopRunning = YES; // globalwhile (isLoopRunning && [myLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]);
//关闭runloop的地方- (void)quitLoop { isLoopRunning = NO; CFRunLoopStop(CFRunLoopGetCurrent());}
三. 总之
如果不想退出runloop可以使用第一种方式启动runloop;
使用第二种方式启动runloop,可以通过设置超时时间来退出;
使用第三种方式启动runloop,可以通过设置超时时间或者使用CFRunLoopStop方法来退出。
- iOS开发-RunLoop的退出方式
- iOS开发--常见的退出键盘的几种方式
- iOS开发笔记>> runLoop机制的简介
- (iOS开发) RunLoop与NSTimer的相关
- ios开发--RunLoop的基础知识
- iOS开发 runloop&runtime
- iOS开发多线程-RunLoop
- iOS开发之Runloop
- iOS开发-RunLoop总结
- iOS开发之runloop
- ios开发中的runloop
- ios高级开发----RunLoop
- iOS开发-RunLoop总结
- iOS开发-Runloop机制
- iOS开发之Runloop
- runLoop 添加timer的正确方式 (ios oc)
- iOS 的RunLoop初识
- ios runloop的初探
- TensorLow: FailedPreconditionError:Attempting to use uninitialized value Variable
- 斐波那契+数颜色
- 图像处理-双边滤波原理
- android 链式调用
- KMP
- iOS开发-RunLoop的退出方式
- cvpr 2017 re-id papers
- 11.7 T3.B
- struct和typedef struct
- tensorflow(2)---linux,anaconda2,pycharm中调用tensorflow
- VB.net 图片加载内存问题
- install ssh by Cygwin about windows
- Cas单点登录(7)Cas登录过期时间
- angular的服务小总结