iphone - 从 NSOperation 中取消 NSOperationQueue

标签 iphone objective-c cocoa cocoa-touch nsoperationqueue

我有一些 iPhone SDK 4.0 代码,它初始化一个 NSOperationQueue,然后添加三个类(ClassAClassBClassC ) 来一个接一个地运行。 ClassAClassBClassC 都是 NSOperation 的子类。

相关代码如下。

ClassA *classA = [[ClassA alloc] init];
ClassB *classB = [[ClassB alloc] init];
ClassC *classC = [[ClassC alloc] init];

[classB addDependency:classA];
[classC addDependency:classB];

NSOperationQueue *queue = [[NSOperationQueue alloc] init];

[queue addOperation:classA];
[queue addOperation:classB];
[queue addOperation:classC];

[classA release];
[classB release];
[classC release];
[queue release];

产生依赖关系的原因是,classB 仅应在 classA 成功完成其操作时运行。同样,classC 仅应在 classB 成功完成时运行。

目前,我很难弄清楚如何防止例如 classBclassA 未成功完成的情况下运行。继续这个例子,我正在考虑以某种方式从 classA 中调用 [NSOperationQueue cancelAllOperations] 但我不知道如何获取父 NSOperationQueue 的句柄 来自 classA (它是 NSOperation 子类)。这只是我最初的想法,因此我愿意接受任何其他更好的建议来实现相同的结果!

每个类中都有条件代码来确定它们是否已正确完成 - 目前它们只是 NSLogging “成功”或“失败”到控制台以进行调试。在完美的世界中,我只是希望能够用一些代码替换每个类中的 NSLog(@"Fail") 语句,这些代码将阻止 NSOperationQueue 中的所有其他类运行。

我们非常欢迎(并赞赏)任何建议。

最佳答案

您可以在 classA 中设置属性:

@property (readonly) BOOL completedSucessfully;

并在 classA 的 main 方法末尾将其设置为 YES。

然后,只需在 classB 的开头检查它即可。

- (void)main {
    if (NO == [[dependencies objectAtIndex:0] completedSucessfully])
        return;

现在,如果 classA 报告失败,classB 将停止。

注意,您可能需要在上面的示例中进行更多错误检查,即确保您具有依赖项,检查它是否是正确的类等。

- (void)main {
    for (id *temp in [self dependencies])
        if ([temp isKindOfClass:[ClassA class]])
            if (NO == [(ClassA *)temp finishedSucessfully])
                return;

关于iphone - 从 NSOperation 中取消 NSOperationQueue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3174299/

相关文章:

swift - 图像分类器在 Xcode 中的分类标签中不显示结果

ios - 格式字符串未使用数据参数?

ios - 所有 View 的监听器

objective-c - Mac 应用程序中的数据库选项

macos - 如何在 NSTextField 中添加 Cocoa 控件?

javascript - iPhone:Phonegap:后台播放音频

iphone - 在 iPhone 上自定义相机 View 大小

objective-c - NSTableCellViews 的自动布局系统是否不同?

java - freemarker生成的docx后缀的word文档在iphone上无法显示图片

ios - 如何访问调用类别方法的对象?