V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
hitmiss
V2EX  ›  iDev

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

  •  
  •   hitmiss · 2011-11-26 20:24:02 +08:00 · 4230 次点击
    这是一个创建于 4738 天前的主题,其中的信息可能已经有所发展或是发生改变。
    请问除了把计时器添加到主线程。还有什么办法?

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

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

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

    已经该用了通知中心的实现,不过还想纠结下计时器和线程的问题 :P
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2871 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 02:45 · PVG 10:45 · LAX 18:45 · JFK 21:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.