在我的一個應用程序中,我有一個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的屬性不會做你想做的:它會弱引用數組,而不是它的元素。只要失去其他引用,數組可能會被釋放。 –