gpt4 book ai didi

iphone - 从 NSOperation 中取消 NSOperationQueue

转载 作者:行者123 更新时间:2023-12-03 17:30:54 26 4
gpt4 key购买 nike

我有一些 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com