在NSOperation中使用NSThread睡眠

ban*_*isa 6 objective-c nsoperation grand-central-dispatch nsrunloop ios

使用一些代码,我遇到了运行循环,我是新手,在NSOperations 里面.

他们NSOperation正在忙于下载数据 - 当他们忙碌时,会有代码等待下载完成,以NSRunLoops和线程休眠的形式.

我特别感兴趣的是这段代码:

while (aCertainConditionIsTrue && [self isCancelled]==NO) {
     if(![[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:1.0]]){
        [NSThread sleepForTimeInterval:1.0];
     }
}
Run Code Online (Sandbox Code Playgroud)

我已经阅读了关于运行循环的信息,runMode:beforeDate:并将等待输入源或超时.虽然我不是百分之百的东西.

在第一次执行时,它总是返回NO并命中sleepForTimeInterval:.这不好吗?

在一个特定的实用程序类中,它经常会sleepForTimeInterval:遇到很多 - 每个线程一次 - 这会严重损害性能.

对此有什么更好的解决方案或建议吗?

jim*_*myg 2

睡眠会锁定线程。也许您更改代码以使用performSelector:withObject:afterDelay。这样你的线程就可以继续运行。

    ...
    done = NO;
    [self checkDoneCondition:nil];
    ...

- (void)checkDoneCondition:(id)object {
    if (aCertainConditionIsTrue && [self isCancelled]==NO) {
        if(...) {
            [self performSelector:@selector(checkDoneCondition:) withObject:[con error] afterDelay:1.0];
        } else {
            done = YES;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)