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 · May 26, 2017 · 3802 views
    This topic created in 3355 days ago, the information mentioned may be changed or developed.
    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 replies    2017-05-27 14:07:30 +08:00
    ldp940622
        1
    ldp940622  
       May 26, 2017   ❤️ 1
    我觉得 dispatch_after 应该只用于执行一次的延时操作,如果要重复做的话,不用 NSTimer 还可以用 dispatch source 或者 RunLoop 去做。
    linKnowEasy
        2
    linKnowEasy  
    OP
       May 26, 2017
    @ldp940622 其实因为 延迟执行的时间是 不定的, delayInSeconds = Random ( int )
    pljhonglu
        3
    pljhonglu  
       May 26, 2017   ❤️ 1
    可以啊。
    和 timer 对比的话,硬要说区别还是有的,timer 是 runloop 的 timer source 这种方式是通过 dispatch port 唤醒 runloop。
    ldp940622
        4
    ldp940622  
       May 26, 2017
    @linKnowEasy #2 如果是这种好像也只能类似的方法做了,也许是我技术比较水没想到 /捂脸
    linKnowEasy
        5
    linKnowEasy  
    OP
       May 27, 2017
    @pljhonglu 主要是担心会不会有 线程 和 释放 问题
    pljhonglu
        6
    pljhonglu  
       May 27, 2017   ❤️ 1
    @linKnowEasy #5 都是在主线程 runloop 里面运行的,释放的话写的时候注意点儿,没什么问题~
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2961 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 14:05 · PVG 22:05 · LAX 07:05 · JFK 10:05
    ♥ Do have faith in what you're doing.