【问题标题】:NSOperationqueue and postnotification when finished完成后的 NSOperationqueue 和 postnotification
【发布时间】:2014-01-08 06:35:01
【问题描述】:

我意识到这是其他人在我之前遇到过的问题,但我似乎无法找到一个好的解决方案。我的问题是我想遍历存储在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 的子类中的常规主函数运行并发操作。也许我在这里误解了一些东西,但是关于如何确保不仅队列是空的,而且确保操作已经完成的建议将不胜感激。

干杯,特隆德

【问题讨论】:

    标签: objective-c cocoa objective-c-blocks nsoperation nsoperationqueue


    【解决方案1】:

    您似乎不需要通知(至少不需要触发最终处理)。相反,创建一个新操作,使其依赖于您为处理添加的所有其他操作,然后将其添加到队列中。然后它只会在所有其他操作完成后运行。


    isFinished 确定操作何时完成是正确的。需要考虑的一件事是,添加到操作中的任何 completionBlock 都会在操作完成之后运行(而不是在完成之前)。

    【讨论】:

    • “使其依赖于所有其他操作” - 这不是 OP 已经在做的事情吗?
    • 这正是我正在做的。我的最后一个 NSInvocationOperation 依赖于所有其他操作。最终操作应调用 runLastOperation 并发出通知。通知在 12 个操作的队列中触发 4-5 次,我不明白为什么。
    • 那么什么时候定义为完成的操作(添加日志),有多少同时运行(添加日志),在通知帖子中添加断点。这一切都告诉你关于操作顺序的什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    相关资源
    最近更新 更多