我正在使用NSOperation
子类(称为PointsOperation)在我的应用程序的后台执行一些计算。由于用户的行为,这些计算可能需要取消,并开始新的计算。在这种情况下,我将创建一个新的PointsOperation
实例,并将其作为第一个添加到相同的NSOperationQueue
。作为PointsOperation的主要方法中的第一件事,它将检查另一个操作是否已在运行,并取消它。NSOperation waitUntilFinished等待很长时间
因为这些操作正在使用某些共享缓存,所以它们不能(并且不需要)并行运行。因此,第二个操作将等到第一个操作完成。主方法生成的代码看起来是这样的:
static NSOperation *currentOperation = nil;
- (void) main
{
// setting up autorelease pool, catching exceptions, etc
@synchronized(lock) {
if (currentOperation != nil) {
[currentOperation cancel];
[currentOperation waitUntilFinished];
}
currentOperation = self;
}
while (!calculationsFinished && ![self isCancelled]) {
// do calculations
}
currentOperation = nil;
// releasing autorelease pool, etc
}
这一切工作正常,第一个操作被取消,并为它完成第二等待,然后开始计算。
问题是:在结束主要方法的第一个操作和从waitUntilFinished
出来的第二个操作之间需要3-10秒。
有没有人看过这个,知道该怎么办?
我也试过,而不是waitUntilFinished
,使第二个操作依赖于第一个,与“addDependency:”(在init方法,而不是主)。这也适用,但也有同样的问题:第二个操作的开始是第一个方法完成后的秒数。
感谢您的回答。正如你在上面的代码和描述中看到的,我确实检查了isCancelled。另外,我使用NSLog语句验证了操作因取消而完成,并且延迟肯定在第一个操作的主方法结束和waitUntilFinished出来的第二个操作之间。 – fishinear 2012-01-06 17:18:17
@fishinear对不起,我错过了:( – tia 2012-01-06 17:20:36
并不意味着唠叨你,但我注意到你拼写错了'[currentOparation waitUntilFinished]'这行变量,仍然得到它编译? – tia 2012-01-06 17:31:38