Ios 无法使用NSTimer使NSO操作超时

Ios 无法使用NSTimer使NSO操作超时,ios,cocoa-touch,nstimer,nsoperation,nsoperationqueue,Ios,Cocoa Touch,Nstimer,Nsoperation,Nsoperationqueue,我正试图用NSTimer超时我的NSOperation,但我的计时器没有被触发。请看下面我在类中编写的代码,它是子类NSOperation - (void)start { // Start the timer for Time out before the ping activity starts self.timeOutTriggerTimmer = [NSTimer scheduledTimerWithTimeInterval:10.0 target:self selecto

我正试图用
NSTimer
超时我的
NSOperation
,但我的计时器没有被触发。请看下面我在类中编写的代码,它是子类
NSOperation

- (void)start {
    // Start the timer for Time out before the ping activity starts
    self.timeOutTriggerTimmer = [NSTimer scheduledTimerWithTimeInterval:10.0 target:self selector:@selector(cancelTheOperation) userInfo:nil repeats:NO];
    [[NSRunLoop currentRunLoop] addTimer:self.timeOutTriggerTimmer forMode:NSDefaultRunLoopMode];

    // Check for cancellation
    if ([self isCancelled]) {
        [self completeOperation];
        return;
    }

    // Executing
    [self willChangeValueForKey:@"isExecuting"];
    executing = YES;
    [self didChangeValueForKey:@"isExecuting"];

    // Begin
    [self beginOperation];
}

最简单的方法是将计时器添加到主运行循环,而不是当前运行循环:

[[NSRunLoop mainRunLoop] addTimer:self.timeOutTriggerTimmer forMode:NSDefaultRunLoopMode];
或者,您可以保持计时器不变(在当前运行循环中安排),但您必须保持运行循环处于活动状态,可能需要在
start
方法的末尾添加以下内容(注意,苹果建议使用此方法,而不是
run
方法):

但这(就像您设想的
run
方法)有效地保持
start
方法运行,直到执行完成(使看起来是并发操作的行为更像是非并发操作)


我怀疑您已经在这样做了,但为了以防万一,请确保在完成操作时使计时器失效,否则计时器将保留操作直到计时器触发,从而不必要地延迟释放操作的资源(并调用
取消操作
,即使操作可能已经完成)。

最简单的方法是将计时器添加到主运行循环,而不是当前运行循环:

[[NSRunLoop mainRunLoop] addTimer:self.timeOutTriggerTimmer forMode:NSDefaultRunLoopMode];
或者,您可以保持计时器不变(在当前运行循环中安排),但您必须保持运行循环处于活动状态,可能需要在
start
方法的末尾添加以下内容(注意,苹果建议使用此方法,而不是
run
方法):

但这(就像您设想的
run
方法)有效地保持
start
方法运行,直到执行完成(使看起来是并发操作的行为更像是非并发操作)


我怀疑您已经在这样做了,但为了以防万一,请确保在完成操作时使计时器失效,否则计时器将保留操作直到计时器触发,从而不必要地延迟释放操作的资源(并调用
取消操作
,即使该操作可能已经完成)。

我发现了问题。我需要执行下面的语句

[[NSRunLoop currentRunLoop] run];

我发现了问题。我需要在下面的语句中执行它

[[NSRunLoop currentRunLoop] run];

我会小心这个解决方案。请参阅以获得首选的替代方案。或者,更简单的是,只使用主运行循环。如果使用
run
,请执行一些测试以确认
start
方法最终终止。我会小心这个解决方案。请参阅以获得首选的替代方案。或者,更简单的是,只使用主运行循环。如果使用
r取消
,执行一些测试以确认开始方法最终终止。接受这个答案因为它更有意义。谢谢@Rob。接受这个答案因为它更有意义。谢谢@Rob。