我有一些 iPhone SDK 4.0 代码,它初始化一个 NSOperationQueue
,然后添加三个类(ClassA
、ClassB
和 ClassC
) 来一个接一个地运行。 ClassA
、ClassB
和 ClassC
都是 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
成功完成时运行。
目前,我很难弄清楚如何防止例如 classB
在 classA
未成功完成的情况下运行。继续这个例子,我正在考虑以某种方式从 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/