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。