注册 登录
主题 : Runloop开启的常驻线程 有什么用?
级别: 新手上路
UID: 636498
精华: 0
发帖: 4
可可豆: 22 CB
威望: 22 点
在线时间: 9(时)
注册时间: 2018-03-29
最后登录: 2018-08-01
0 楼:  发表于: 2018-07-11 23:00    发自: Web Page
来源于 一般提问 分类

Runloop开启的常驻线程 有什么用?   

什么时候需要 开启一个常驻线程? 常驻线程里面的任务 是会一直执行的吗?请大佬赐教
图片:屏幕快照 2018-07-11 下午10.48.28.png
级别: 版主

状态: 连续签到 - [7天]
UID: 123750
精华: 2
发帖: 2309
可可豆: 3706 CB
威望: 3627 点
在线时间: 1843(时)
注册时间: 2012-02-15
最后登录: 2018-11-21
1 楼:  发表于: 2018-07-12 09:40    发自: Web Page
刚好昨天回答了一个这样的问题

1、首先你又一个子线程
2、子线程上有一个runloop,并且并且这个runloop的输入源或者说叫做唤醒源是 mschport ,然后runloop run在了这个子线程上

这里有亮点需要注意 1,如果只有一个子线程,那么它会立刻退出,确保它不推出的条件就是又一个runloop, 但是只有一个runloop 没有对应的唤醒机制这个runloop不会起作用,那么线程还是回推出,最后,又一个输入源就是mschport,可以确保这个runloop 等待 machport事件 也就确保这个线程不会推出。最后我们知道machport 事件有一类是来自于系统底层的触控事件

以上的条件可以保证 一个线程,在runloop等待 触摸事件的基础上不会退出。结合你的代码来看可以清晰的看到这一点

3.当没有触摸事件的时候,runloop 在休眠,线程什么也不干但是并不会退出

4.当有触摸时间的时候,将触摸事件抛给这个线程,然后开始匹配,发现正好是nsdefaultrunloopmode 这种模式,因此 runloop 被唤醒,处理此事件,当触摸结束之后,runloop 在处理完最后一个touchevent之后进入休眠,进而线程也跟着进入休眠状态


<null>
级别: 新手上路
UID: 636498
精华: 0
发帖: 4
可可豆: 22 CB
威望: 22 点
在线时间: 9(时)
注册时间: 2018-03-29
最后登录: 2018-08-01
2 楼:  发表于: 2018-07-12 22:22    发自: Web Page
回 1楼(wszcug) 的帖子
你好大神,假如现在有这样一个需求,需要在app运行时,开启一条子线程,一直来获取用户当前的位置,一直到用户退出app。想用一个常驻的子线程来做,但是因为runloop休眠的原因,需要手动唤起runloop,但是这样的话,就达不到在后台自动获取的效果了。请问有什么办法呢?
级别: 版主

状态: 连续签到 - [7天]
UID: 123750
精华: 2
发帖: 2309
可可豆: 3706 CB
威望: 3627 点
在线时间: 1843(时)
注册时间: 2012-02-15
最后登录: 2018-11-21
3 楼:  发表于: 2018-07-13 09:22    发自: Web Page
回 2楼(不愿意透露姓名的菜鸡) 的帖子
首先 runloop 输入源也就是你说的唤醒源可以分为两大类,一种是时间源,一种是事件源,时间源很简单就是定时器,时间源包括比较多,像用户触发或者系统底层事件都可以,因此,你这种需求可以用事件源来做,定时触发

其次,你想在后台也获取,如果app 合法运用了后台获取用户的位置信息,是可以后台运行的,这个条件不依赖于你用的是runloop 还是其他什么手段

因此这个需求可以满足
<null>

本站内容均为本站转发,已尽可能注明出处。因未能核实来源或转发内容图片有权利瑕疵的,请及时联系本站,本站会第一时间进行修改或删除。 QQ : 3442093904

描述
快速回复

关注本帖(如果有新回复会站内信通知您)

发帖、回帖都会得到可观的积分奖励。查看论坛积分规则

按"Ctrl+Enter"直接提交
    顶部