2013-07-02 44 views
14

我閱讀Apple文檔,瞭解如何使用串行隊列確保任務按可預測的順序執行,但現在我感到困惑得太多。
一些我如何能夠串行工作,但仍然不清楚,所以我需要簡單的串行示例爲我的方法串行執行。簡單的GCD串行隊列示例如使用塊的FIFO

我分了我的功能在4份,現在要他們執行串行

[self ReadAllImagesFromPhotosLibrary]; 

[self WriteFewImagestoDirectory]; 

[self GettingBackAllImagesFromFolder]; 

[self MoveToNextView]; 
+0

如果您對以下答案之一感到滿意,請將其標記爲正確答案。 – Benjamin

回答

1

您可以使用NSOperationQueuemaxConcurrentOperationCount設置爲1(甚至設置依賴每個的NSOperation,所以不會啓動在它的依賴完成之前)。

這裏是NSOperationQueue類參考。

也看看this的問題。

3
dispatch_queue_t serialQueue = dispatch_queue_create("com.unique.name.queue", DISPATCH_QUEUE_SERIAL); 

dispatch_async(serialQueue, ^{ 
     [self ReadAllImagesFromPhotosLibrary]; 
      dispatch_async(serialQueue, ^{ 
        [self WriteFewImagestoDirectory]; 
        dispatch_async(serialQueue, ^{ 
         [self GettingBackAllImagesFromFolder]; 
         dispatch_async(serialQueue, ^{ 
           [self MoveToNextView]; 
         }); 
        }); 
       }); 
    }); 

我想上面的代碼應該可以工作,但要確保UI操作在主線程中執行。希望能幫助到你。

+0

是什麼?如何使用4個方法調用一次調度異步? (做同樣的事情) – dcow

+0

遞歸調度調用是沒有意義的。這是無用的開銷。 – Karsten

+0

「com.unique.name.queue」可能是正確的?你爲什麼這樣說呢? ** com **是什麼意思? – Honey

1

我沒有太多的意識到現有的API與塊做同樣的工作,如果有的話。

但是,通過定義塊(代表您想要的操作),可以通過指向下一個塊的方式(如果有的話)繼續進行。另外,您可以將整個處理放在單獨的隊列中。

片段對具有串行方式執行塊

BLOCK A(NEXT BLOCK reference){ 
->Do the the required Task 
->If(next Block reference) 
--->Then call that block 
->Else 
--->Exit or have a callback on mainthread 
} 
0

爲什麼不嘗試GCD,它保證操作的順序,也有同步和異步功能

37

跟進和完善iCoder的答案,你可以並且應該做以下事情。

dispatch_queue_t serialQueue = dispatch_queue_create("com.unique.name.queue", DISPATCH_QUEUE_SERIAL); 

dispatch_async(serialQueue, ^{ 
     [self ReadAllImagesFromPhotosLibrary]; 
    }); 
dispatch_async(serialQueue, ^{ 
     [self WriteFewImagestoDirectory]; 
}); 
dispatch_async(serialQueue, ^{ 
    [self GettingBackAllImagesFromFolder]; 
}); 
dispatch_async(serialQueue, ^{ 
    [self MoveToNextView]; 
}); 

儘管上述呼籲是異步,他們將排隊,按順序運行DISPATCH_QUEUE_SERIAL狀態。 同步異步之間的區別是,同步,你代碼將暫停並運行下面的代碼之前等待爲塊的答案,從而有可能凍結您的UI如果執行時間長。而async代碼運行並且該塊異步返回

但是,由於GCD(Grand Central Dispatch),您存儲在DISPATCH_QUEUE_SERIAL中的任務將按照它們添加的順序一個接一個地執行。

-1

我在Swift3.0中類似的模式中取得了一些成功...

let serialQueue = DispatchQueue.init(label: "com.foo.bar") 

serialQueue.sync {self.readAllImagesFromPhotosLibrary()} 

serialQueue.sync {self.rriteFewImagestoDirectory()} 

serialQueue.sync {self.gettingBackAllImagesFromFolder()} 

serialQueue.sync {self.moveToNextView()}