在我的一个应用程序中,我有一个NSOperationQueue和一些NSOperations的子类。 我添加了一些依赖关系,所以操作A在操作B完成之前不会启动。NSoperation reverse dependencies
如果操作B失败,我需要取消操作A,但从操作B中我没有任何依赖于当前操作的操作列表。
我会尽量在我的子类中添加一些薄弱的属性,如
@property (nonatomic, weak) NSArray *dependsOnMe;
但是我怕产生一些奇怪的循环。
感谢
在我的一个应用程序中,我有一个NSOperationQueue和一些NSOperations的子类。 我添加了一些依赖关系,所以操作A在操作B完成之前不会启动。NSoperation reverse dependencies
如果操作B失败,我需要取消操作A,但从操作B中我没有任何依赖于当前操作的操作列表。
我会尽量在我的子类中添加一些薄弱的属性,如
@property (nonatomic, weak) NSArray *dependsOnMe;
但是我怕产生一些奇怪的循环。
感谢
即使世界有点在这里失去了信息的。就像你在构建B时一样,你是否也构造了A?
是否需要这样做?为什么不建构A成功完成B?
你可以使用使用一个委托协议,如果一个从B中的一个扶养至A
@protocol DependantOperationCompletion <NSObject>
-(void)operationDidFail;
@end
@interface BOperation
@property (weak) id<DependantOperationCompletion> delegate;
@end
和
@interface AOperation:NSOperation <DependantOperationCompletion>
...
@end
那么当你构建业务设立了作为一个代表乙
bOpInstance.delegate = aOpInstance;
替代地使用“S如果B出现故障,请发出通知并发布通知。 A听通知。
乙内...
-(void)handleFailure
{
[[NSNotificationCenter defaultCenter] postNotificationName:BTypeOpDidFailNotification object:self userInfo:someInfoOrNil]
}
内的
...
-(void)setupWithBOp:(BOperation *)binstance
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ohNoBHazFailed:) name:BTypeOpDidFailNotification object:binstance];
}
记住要删除观察员对dealloc
回答你的问题,我更喜欢在同一时间创建所有操作以获得更易读的代码。 其实操作链包含四个操作! – TheObjCGuy
I've added some dependencies so, the operation A not start until operation B finish.
和:
I need to cancel the operation A if the operation B fails
你看这是怎么回事?
什么意思,将从B
取消B
如果B
失败。但是,A
只有在B
完成时才会启动。
从here:
相关性:可以使操作依赖于其他业务。 任何操作都可能取决于任何数量的操作。当您操作A取决于操作B时,即使您在操作A上调用 “开始”,除非操作B isFinished为真,它也不会启动。例如:
MyDownloadOperation *downloadOp = [[MyDownloadOperation alloc] init]; // MyDownloadOperation is a subclass of NSOperation
MyFilterOperation *filterOp = [[MyFilterOperation alloc] init]; // MyFilterOperation is a subclass of NSOperation
[filterOp addDependency:downloadOp];
对不起,我看不到这一点。 A取决于B,但如果B失败A必须取消。即使B失败,也会执行标准实现。 – TheObjCGuy
告诉我你是如何做'A取决于B'。 – Peres
@TheObjCGuy检查我的编辑。你的例子中的 – Peres
虽然我讨论的方式后期,这里就是我写来帮我弄颠倒了一个依赖的NSOperation。如果你知道使用的队列,那么你可以使用这个扩展:
extension NSOperationQueue {
func reverseDependenciesForOperation(op: NSOperation) -> [NSOperation] {
return operations.filter { $0.dependencies.contains(op) }
}
}
弱NSArray的属性不会做你想做的:它会弱引用数组,而不是它的元素。只要失去其他引用,数组可能会被释放。 –