2013-09-24 34 views
1

我有一個需要執行的幾個步驟的過程,每個過程需要在另一個過程之前完成(同步,串行等)。我想使用隊列的想法,並有一個用於我的數據庫更新來保護核心數據。什麼是引發更新/訪問核心數據的最佳方式,但確保一旦完成後我可以做我需要的事情?我已經得到了下面的內容,但是完成後我該怎麼做?我是否甚至需要爲這個「保護」我的核心數據而煩惱,或者如果整個事情是連續的,我可以訪問它?使用NSOperationQueue保護核心數據調用addOperationWithBlock

 [databaseQueue addOperationWithBlock:^{ 
         // access MOC to update DB 
    }]; 

回答

1

如果您只是需要序列化您的訪問權限,則可以正好使用新的託管上下文架構(專用隊列)。

您定義的管理對象上下文,像這樣:

NSManagedObjectContext* context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 
context.persistentStoreCoordinator = coordinator; 
//any other initialization you need 
[ContextProvider setWorkerContext:context]; 

這方面將使用GCD後臺線程操作。

您需要保留此上下文(例如,在您的應用程序委託或任何其他對您有意義的地方,只要您需要時可以訪問它)。

此上下文現在可以用作所需操作的隊列(您可能可以在沒有NSOperations的情況下完成所需操作)。

要發出一個任務,你只需調用隊列:

[[ContextProvider workerContext] performBlock:^{//do something asynchronously 
    //Do whatever you need to do 
    //The context will serialize tasks in the order they were queued 
    //You will probably want to save at the end of each task. 
}]; 

您可以添加包裝調用完成塊,如果你喜歡,還是聽上下文更改/保存事件。

如果您需要依賴任務之間的依賴關係,或者您希望能夠以方便的方式取消任務(您仍然需要檢查任務是否被取消),您將需要NSOperationNSOperationQueue,但是您將很可能需要不止一個上下文。

在任何情況下,只有一個上下文可以在任何給定時刻寫入存儲器(寫入時存儲器是串行的),其他寫入/讀取上下文將在寫入期間被阻止訪問存儲器。