我意识到这是其他人在我之前遇到的问题,但我似乎无法找到一个好的解决方案。我的问题是我想循环存储在NSOperationQueue中的一些操作,当所有操作都完成后,我想发布一个通知。通知启动最终过程,该过程依赖于已完成的所有操作。但是,在操作完成之前,我的通知会多次发送。这是我的方法:
self.queueFinished=FALSE;
[self createFileobjectsForDirectories:self.mymode];
这导致一系列操作(self.arrayOfOperations)进一步使用:
[self.myFileobjectsQueue addOperations:self.arrayOfOperations waitUntilFinished:NO];
NSInvocationOperation *completionOperation = [[NSInvocationOperation alloc] initWithTarget:self
selector:@selector(runLastOperation:)
object:start];
for (NSOperation *myOp in self.myFileobjectsQueue.operations){
[completionOperation addDependency:myOp];
}
[completionOperation setQueuePriority:NSOperationQueuePriorityVeryLow];
[self.myFileobjectsQueue addOperation:completionOperation];
-(void) runLastOperation:(NSDate*) start {
[[NSNotificationCenter defaultCenter] postNotificationName:kCompareFinished object:nil userInfo:nil];
self.queueFinished=TRUE;
}
我已经尝试了几种方法来观察我的队列何时完成建议elsewhere,但没有成功。这几乎就像在队列为空时调用通知,但在操作完成任务之前。但根据Apple文档,在isFinished
标志为TRUE
之前,不会从队列中删除该操作。我正在使用NSOperation的子类中的常规main函数运行并发操作。也许我在这里误解了一些东西,但建议如何确保不仅队列是空的,而且还要确保操作已经完成,将非常感激。
干杯,特隆德
答案 0 :(得分:0)
您似乎不需要通知(至少不会触发最终处理)。而是创建一个新操作,使其依赖于为处理添加的所有其他操作,然后将其添加到队列中。然后只有在所有其他操作完成后才会运行。
关于isFinished
确定操作何时结束,你是正确的。需要考虑的一点是,添加到操作中的任何completionBlock
都是在操作完成后运行的(不仅仅是在它完成之前)。