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