2013-10-02 83 views
0

在我的一個應用程序中,我有一個NSOperationQueue和一些NSOperations的子類。 我添加了一些依賴關係,所以操作A在操作B完成之前不會啓動。NSoperation reverse dependencies

如果操作B失敗,我需要取消操作A,但從操作B中我沒有任何依賴於當前操作的操作列表。

我會盡量在我的子類中添加一些薄弱的屬性,如

@property (nonatomic, weak) NSArray *dependsOnMe;

但是我怕產生一些奇怪的循環。

感謝

+0

弱NSArray的屬性不會做你想做的:它會弱引用數組,而不是它的元素。只要失去其他引用,數組可能會被釋放。 –

回答

0

即使世界有點在這裏失去了信息的。就像你在構建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

+0

回答你的問題,我更喜歡在同一時間創建所有操作以獲得更易讀的代碼。 其實操作鏈包含四個操作! – TheObjCGuy

0
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]; 
+0

對不起,我看不到這一點。 A取決於B,但如果B失敗A必須取消。即使B失敗,也會執行標準實現。 – TheObjCGuy

+0

告訴我你是如何做'A取決於B'。 – Peres

+0

@TheObjCGuy檢查我的編輯。你的例子中的 – Peres

1

雖然我討論的方式後期,這裏就是我寫來幫我弄顛倒了一個依賴的NSOperation。如果你知道使用的隊列,那麼你可以使用這個擴展:

extension NSOperationQueue { 
    func reverseDependenciesForOperation(op: NSOperation) -> [NSOperation] { 
     return operations.filter { $0.dependencies.contains(op) } 
    } 
}