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
linKnowEasy
V2EX  ›  iDev

递归执行 dispatch_after 的问题

  •  
  •   linKnowEasy · 2017-05-26 17:00:29 +08:00 · 3278 次点击
    这是一个创建于 2757 天前的主题,其中的信息可能已经有所发展或是发生改变。
    int nowloopId = 0;
    
    - (void)testDisAfter:(int) loopId {
        
        if (nowloopId != loopId) {
            return;
        }
        
        
        /// doing something
        
        double delayInSeconds = 1.0;
        dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
        __weak typeof (self) wself = self;
        dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
            
            
            [wself testDisAfter:loopId];
        });
    }
    

    这样通过 nowloopId++; 来控制 testDisAfter 循环关闭 会不会有问题. nowloopId++; 在主线程执行

    总感觉这样操作看着不对. 但是又找不出不对的地方. 所以想请教一下各位。

    还有就是. 这样的方式 和 使用 NSTimer 对比

    6 条回复    2017-05-27 14:07:30 +08:00
    ldp940622
        1
    ldp940622  
       2017-05-26 17:42:55 +08:00   ❤️ 1
    我觉得 dispatch_after 应该只用于执行一次的延时操作,如果要重复做的话,不用 NSTimer 还可以用 dispatch source 或者 RunLoop 去做。
    linKnowEasy
        2
    linKnowEasy  
    OP
       2017-05-26 17:44:48 +08:00
    @ldp940622 其实因为 延迟执行的时间是 不定的, delayInSeconds = Random ( int )
    pljhonglu
        3
    pljhonglu  
       2017-05-26 18:41:49 +08:00   ❤️ 1
    可以啊。
    和 timer 对比的话,硬要说区别还是有的,timer 是 runloop 的 timer source 这种方式是通过 dispatch port 唤醒 runloop。
    ldp940622
        4
    ldp940622  
       2017-05-26 18:56:11 +08:00
    @linKnowEasy #2 如果是这种好像也只能类似的方法做了,也许是我技术比较水没想到 /捂脸
    linKnowEasy
        5
    linKnowEasy  
    OP
       2017-05-27 08:56:58 +08:00
    @pljhonglu 主要是担心会不会有 线程 和 释放 问题
    pljhonglu
        6
    pljhonglu  
       2017-05-27 14:07:30 +08:00   ❤️ 1
    @linKnowEasy #5 都是在主线程 runloop 里面运行的,释放的话写的时候注意点儿,没什么问题~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3047 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 11:57 · PVG 19:57 · LAX 03:57 · JFK 06:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.