【问题标题】:Using NSThread sleep in an NSOperation在 NSOperation 中使用 NSThread sleep
【发布时间】:2012-01-19 14:50:39
【问题描述】:

在处理一些代码时,我在NSOperations 中遇到了我不熟悉的运行循环。

NSOperations 正忙于下载数据 - 当他们忙时,有代码等待下载完成,形式为 NSRunLoops 和线程休眠。

我对这段代码特别感兴趣:

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

我已经阅读了有关运行循环的信息,runMode:beforeDate: 将等待输入源或超时。虽然我不是 100% 算作输入源。

在第一次执行时,它总是返回 NO 并点击 sleepForTimeInterval:。这很糟糕吗?

在一个特定的实用程序类中,它会经常访问sleepForTimeInterval: - 每个线程一次 - 这会严重影响性能。

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

【问题讨论】:

    标签: objective-c ios grand-central-dispatch nsoperation nsrunloop


    【解决方案1】:

    睡眠会锁定线程。也许您将代码更改为使用 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;
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      您似乎需要使用 并发 NSOperation。以下是 Apple 文档中的相关部分:

      与同步运行的非并发操作相比, 并发操作异步运行。换句话说,当你 调用并发操作的 start 方法,该方法可以 在相应任务完成之前返回。这可能会发生 因为操作对象创建了一个新线程来执行任务 或者因为操作调用了异步函数。它不是 当控制返回时操作是否正在进行实际上很重要 来电者,只是它可能正在进行中。 (...) 在并发操作中,您的 start 方法负责 以异步方式启动操作。无论你生成一个 线程或调用异步函数,您可以通过此方法执行此操作。 开始操作后,您的 start 方法也应该更新 isExecuting 报告的操作的执行状态 方法。您可以通过发送 KVO 通知来执行此操作 isExecuting 关键路径,让感兴趣的客户知道 操作现在正在运行。您的 isExecuting 方法还必须返回 以线程安全的方式状态。

      (来自https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/NSOperation_class/Reference/Reference.html

      换句话说,您可以覆盖 NSOperation 子类中的 -start 方法,并为 executingfinished 属性设置 ivar。此方法将在单独的线程中开始下载。当下载开始时,您设置executing 标志并触发KVO。当它在这个线程中完成时,您对finishedexecuting 执行相同的操作。看起来很复杂,其实很简单。

      另请参阅 Stack Overflow 上的这个问题并给出很好的解释:Subclassing NSOperation to be concurrent and cancellable

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多