如何避免在计时器触发前所在线程被销毁?

2011-11-26 20:24:02 +08:00
 hitmiss
请问除了把计时器添加到主线程。还有什么办法?

还有,默认没有提供这种保证机制是基于什么考量?
4150 次点击
所在节点    iDev
9 条回复
Livid
2011-11-26 20:30:37 +08:00
如果是因为程序里需要某种定时刷新机制,那么可以把 NSTimer 在 app delegate 的程序完成启动时注册,然后定时 fire 的 selector 里发送 NSNotification,然后如果这个时候需要响应的 view controller 还存在的话,就通过应答这条 NSNotification 来实现吧。
hitmiss
2011-11-26 20:52:57 +08:00
通知中心的实现方式很有启发!

具体一些,我是在使用 performSelector:withObject:afterDelay: 这个函数时遇到的这个问题,我在一个网络吞吐的线程上调用这个函数来延时隐藏一个视图,发现最终该线程销毁,selector 没有被触发。现在是把这个操作挪到主线程上了,但是不知道有什么副作用。
Kai
2011-11-26 20:59:13 +08:00
singleton 里面,dispatch_once 一个定时器,然后用这个定时器发送 notification
keakon
2011-11-26 21:14:01 +08:00
@hitmiss 隐藏视图本来就应该在主线程操作啊
hitmiss
2011-11-26 21:16:19 +08:00
@keakon 它是在网络那条线程上被创建的也应该在主线程上隐藏么?
keakon
2011-11-26 21:34:47 +08:00
@hitmiss 所有和界面相关的都只能在主线程上操作啊
hitmiss
2011-11-26 21:35:21 +08:00
@Kai 我对 GCD 的机制和 API 不熟悉,刚才粗略看了一眼文档和网上的资料,你提到的 dispath_once 函数常用来线程安全的创建 singleton。但 timer 不是附着在某条线程的 run loop 上么,所在线程被销毁,还是无法保证计时器触发?
Livid
2011-11-26 21:40:46 +08:00
假设你在做的是一个微博客户端,有一个定时刷新当前用户信息的操作。

在成功获得最新的当前用户信息之后,你希望界面上所有显示用户信息的地方都刷新,那么这个时候最好的做法就是发送 NSNotification,然后所有存活的和显示用户信息有关的 view controller 处理这个 NSNotification。
hitmiss
2011-11-26 22:06:48 +08:00
@Livid 多谢 :]

已经该用了通知中心的实现,不过还想纠结下计时器和线程的问题 :P

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/22232

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX