我有操作的依賴關係圖,我使用多個隊列來組織各種操作流。 例如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個隊列之一上,我做錯了什麼?
你的隊列是並行還是串行?您是否嘗試過其他現有隊列?隊列被阻塞可能會創建事實依賴。 –
所有三個隊列是並行的。不知道我得到你現有隊列的問題 - 你的意思是把操作放在像[NSOperationQueue mainQueue]之類的東西上?目前,所有隊列都是使用[[NSOperationQueue alloc] init]創建的; –