递归执行 dispatch_after 的问题

2017-05-26 17:00:29 +08:00
 linKnowEasy
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 对比

3207 次点击
所在节点    iDev
6 条回复
ldp940622
2017-05-26 17:42:55 +08:00
我觉得 dispatch_after 应该只用于执行一次的延时操作,如果要重复做的话,不用 NSTimer 还可以用 dispatch source 或者 RunLoop 去做。
linKnowEasy
2017-05-26 17:44:48 +08:00
@ldp940622 其实因为 延迟执行的时间是 不定的, delayInSeconds = Random ( int )
pljhonglu
2017-05-26 18:41:49 +08:00
可以啊。
和 timer 对比的话,硬要说区别还是有的,timer 是 runloop 的 timer source 这种方式是通过 dispatch port 唤醒 runloop。
ldp940622
2017-05-26 18:56:11 +08:00
@linKnowEasy #2 如果是这种好像也只能类似的方法做了,也许是我技术比较水没想到 /捂脸
linKnowEasy
2017-05-27 08:56:58 +08:00
@pljhonglu 主要是担心会不会有 线程 和 释放 问题
pljhonglu
2017-05-27 14:07:30 +08:00
@linKnowEasy #5 都是在主线程 runloop 里面运行的,释放的话写的时候注意点儿,没什么问题~

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

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

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

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

© 2021 V2EX