2013-12-13 56 views
3

我有操作的依賴關係圖,我使用多個隊列來組織各種操作流。 例如peopleQueue,sitesQueue,sessionQueueNSOperation依賴另一個不同的隊列上的操作不會啓動

sessionQueue:loginOp,fetchUpdatedAccountOp peopleQueue:mostFrequentlyManagedClientsOp,remainingClientsOp sitesQueue:mostFrequentlyAccessedSitesOp,remainingSitesOp

依賴關係:

*all* -> loginOp 
remainingClientsOp -> mostFrequentlyManagedClientsOp 
remainingSitesOp -> mostFrequentlyAccessedSitesOp 

目前的安裝方法的效果:登錄完成後,所有的其他操作啓動 mostFrequently *是允許快速應用程序響應的子集提取,隨後的操作系統會在ba中獲取更多數據(有時以頁爲單位) ckground。

最近我想我會添加一個依賴於所有葉子操作的操作。 這個最新的操作將作爲一個哨兵告訴我什麼時候圖遍歷已經完成(發射它會導致NSNotification後或什麼)。所以:

sentinelOp -> remainingClientsOp, remainingSitesOp, fetchUpdatedAccountOp 

然而,我發現,即使它的所有依賴關係完成,標記操作也不會啓動/觸發。 哨兵,在當時排隊,在sessionQueue(沒有特別的理由)。

在調試器中玩耍之後,我發現如果標識只依賴於在同一隊列中的操作,我才能觸發它。

我終於通過爲該操作引入了第4個隊列來運行標記。 該標記依賴於其各自隊列中的其他3個葉子操作,然後在全部完成時被調用。

我可以與這個工作模式,但它真的困擾我。 對於mac和iOS,Apple docs表示隊列間依賴關係應該起作用。

我將需要進一步擴展該圖形,以至於使用現有的隊列間依賴關係的隊列阻止該操作執行,這使我很煩惱。 顯然,隊列間依賴性在某種程度上起作用,因爲我將loginOp作爲其他操作的根依賴關係,而不管它們的隊列是否在第一位。

通過將哨兵操作放置在現有的3個隊列之一上,我做錯了什麼?

+1

你的隊列是並行還是串行?您是否嘗試過其他現有隊列?隊列被阻塞可能會創建事實依賴。 –

+0

所有三個隊列是並行的。不知道我得到你現有隊列的問題 - 你的意思是把操作放在像[NSOperationQueue mainQueue]之類的東西上?目前,所有隊列都是使用[[NSOperationQueue alloc] init]創建的; –

回答

2

我只使用了1個隊列解決了這個問題。我仍然不明白原來的實現有什麼問題,但是我學到了一些無需多個隊列的東西。

首先,觀察使用KVO計數的待處理操作是有點直截了當的。這就是我能夠摒棄前哨的原因(見https://developer.apple.com/library/ios/documentation/cocoa/reference/NSOperationQueue_class/Reference/Reference.html#//apple_ref/occ/instm/NSOperationQueue/operationCount)。

其次,我維護着幾個隊列,從邏輯上分離出相關的操作。通過一個隊列,我通過將操作生成方法組合到輔助方法中獲得了幾乎相同的結果,每個邏輯單元1個,然後排列輔助程序返回的所有操作。

我不確定從3個隊列到1個隊列是否有性能影響。據我所知,只要操作是併發的,並且隊列對當前執行沒有限制,它應該沒有關係操作是分佈在多個隊列中還是全部分佈在同一個隊列中。

相關問題