【发布时间】:2019-11-05 14:56:06
【问题描述】:
请考虑这个简单的例子:
- (void)viewDidLoad
{
[super viewDidLoad];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"BLOCK!!!");
});
while (YES)
{
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:1]];
NSLog(@"RUN LOOP");
}
});
}
传递给dispatch_after 的第二次调用(3 秒)的块不会被触发。但是,如果我不使用第一个 dispatch_after(2 秒),那么它会按预期工作。为什么?
我知道,如果我删除了 NSRunLoop 在里面运行的 while 循环,那么它可以工作,但我需要那里的循环
【问题讨论】:
-
这种方法中的无限循环是个好主意吗?
-
@trojanfoe 有什么好主意?如果我不使用第一个 dispatch_after(仍在运行 nsrunlopp),那么第二个 dispatch_after 会被触发。如果我再添加一层 dispatch_after,为什么它不会触发?
-
如果你想让东西正常工作,这是个好主意。当你在运行循环时,你也干扰了现有的循环。删除循环,看看会发生什么。
-
如果我删除循环,那没关系,当然。我知道。但我需要循环,但我不明白为什么它会停止工作
-
你可能应该在你的问题中提到这一点,因为它显然是罪魁祸首。
标签: ios objective-c grand-central-dispatch nsrunloop dispatch-after