CoreData并发操作模式简介
生活随笔
收集整理的這篇文章主要介紹了
CoreData并发操作模式简介
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
iOS5.0中,蘋果為CoreData的并發處理添加了兩個內容。
一、首先介紹第一個內容: CoreData框架中的NSManagedObjectContext類增加新的初始化方法: initWithConcurrencyType:(NSManagedObjectContextConcurrencyType)ct;
1.參數方法介紹: NSManagedObjectContextConcurrencyType一共有三種: (1)NSPrivateQueueConcurrencyType:綁定一個后臺線程。 (2)NSMainQueueConcurrencyType:綁定一個主線程。 (3)NSConfinementConcurrencyType:此類型一般不用,這是為了兼容遺留舊代碼用的。此類型不能執行performBlock。
2.ManagedObjectContext的performBlock和performBlockAndWait方法:
(1)performBlock方法: 在上下文隊列中異步執行此block,塞入自動釋放池,然后調用processPendingChanges方法。 - (void)performBlock:(void (^)())block;
(2)performBlockAndWait方法: 在上下文隊列中同步執行此block,調用起來比較安全。 - (void)performBlockAndWait:(void (^)())block;
(3)processPendingChanges方法: 通常情況下上下文會在事件結束時同步改變到對象狀態圖。此方法會明確的觸發此動作。 - (void)processPendingChanges;?
(4)save方法: save保存到磁盤,調用save將自動調用processPendingChanges;
3.線程安全 (1)每一條線程只能有唯一的一個ManagedObjectContext的模式。與此相對應,蘋果的官方文檔給出了兩種解決并發問題的方案: ? ? <1>為每個線程創建單獨的ManagedObjectContext,然后多個ManagedObjectContext共享一個獨立的NSPersistentStoreCoordinator,這個是通常推薦使用的方式。 ? ? <2>為每個線程創建單獨的ManagedObjectContext和NSPersistentStoreCoordinator,這個方法在復雜、大并發的情況下使用,特別是需要在幾個上下文中同步更改的場景,但是這個方法會增加內存使用量。 (2)NSManagedObjects不是線程安全的,但是NSManagedObjectIDs是線程安全的。 (3)如果在background保存,則需要通過core data Notification將changes同步到其他contexts。
二、嵌套的ManagedObjectContext
1.概述: 當子Context中做保存操作時,因為子context沒有persistentStoreCoordinator,這個變化會首先推送給他的父context,這個操作將一直傳遞,直到找到沒有父Context的RootContext為止,當rootContext收到這個消息的時候,rootContext自動合并了這次操作,并且做了最終的保存。所以子context查找時,同樣也會首先從父context那里查找而不是直接與persistentStoreCoordinator交流。當使用這種結構時,不需要特別去監聽NSManagedObjectContextObjectsDidChangeNotification 來合并異步操作到主線程,這也是這種結構的方便之處。
2.對于這種結構,有三種并發策略:
策略一: 這個策略可能并不是那么好,寫在這里主要是為了與更好地備選方案進行對比。這個方案的組成部分: (1)NSMainQueueConcurrencyType類型的Main Context,此上下文與persistentStoreCoordinator進行關聯。 (2)NSPrivateQueueConcurrencyType類型的Background Context,Main Context作為它的上級Context。此Context用作數據插入和查詢。
???
策略二 : 此方案的組成部分: (1)NSPrivateQueueConcurrencyType類型的Master Context,此上下文與persistentStoreCoordinator進行關聯。 (2)NSMainQueueConcurrencyType類型的Main Context,作為Master Context的子Context。 (3)NSPrivateQueueConcurrencyType類型的Worker Context,此Context用作數據插入和查詢。
同樣使用嵌套ManagedObjectContext,但是使用PrivateQueue作為主Context。對于Worker Context作操作將會經由MainQueue Context 最終由MasterContext合并。這個方案的好處在于Worker Context都是臨時工,不需要考慮他們的生命周期。另外的一個好處是,由于他們不能自動獲取到來自父親的更新,所以這個任務可以再未完成之前隨時取消。
策略三 : 這個方案相對保守,沒有使用嵌套Context這個新的特性。 此方案的組成部分: (1)NSMainQueueConcurrencyType類型的Main Context,此上下文與persistentStoreCoordinator進行關聯。 (2)NSPrivateQueueConcurrencyType類型的Background Context,此上下文也關聯同一個persistentStoreCoordinator。
Main Context在主線程隊列,Background Context在子線程隊列。數據同步通過通知實現,每個Context都注冊NSManagedObjectContextDidSaveNotification通知,并且在收到通知后調用另一個Context的mergeChangesFromContextDidSaveNotification方法。
一、首先介紹第一個內容: CoreData框架中的NSManagedObjectContext類增加新的初始化方法: initWithConcurrencyType:(NSManagedObjectContextConcurrencyType)ct;
1.參數方法介紹: NSManagedObjectContextConcurrencyType一共有三種: (1)NSPrivateQueueConcurrencyType:綁定一個后臺線程。 (2)NSMainQueueConcurrencyType:綁定一個主線程。 (3)NSConfinementConcurrencyType:此類型一般不用,這是為了兼容遺留舊代碼用的。此類型不能執行performBlock。
2.ManagedObjectContext的performBlock和performBlockAndWait方法:
(1)performBlock方法: 在上下文隊列中異步執行此block,塞入自動釋放池,然后調用processPendingChanges方法。 - (void)performBlock:(void (^)())block;
(2)performBlockAndWait方法: 在上下文隊列中同步執行此block,調用起來比較安全。 - (void)performBlockAndWait:(void (^)())block;
(3)processPendingChanges方法: 通常情況下上下文會在事件結束時同步改變到對象狀態圖。此方法會明確的觸發此動作。 - (void)processPendingChanges;?
(4)save方法: save保存到磁盤,調用save將自動調用processPendingChanges;
3.線程安全 (1)每一條線程只能有唯一的一個ManagedObjectContext的模式。與此相對應,蘋果的官方文檔給出了兩種解決并發問題的方案: ? ? <1>為每個線程創建單獨的ManagedObjectContext,然后多個ManagedObjectContext共享一個獨立的NSPersistentStoreCoordinator,這個是通常推薦使用的方式。 ? ? <2>為每個線程創建單獨的ManagedObjectContext和NSPersistentStoreCoordinator,這個方法在復雜、大并發的情況下使用,特別是需要在幾個上下文中同步更改的場景,但是這個方法會增加內存使用量。 (2)NSManagedObjects不是線程安全的,但是NSManagedObjectIDs是線程安全的。 (3)如果在background保存,則需要通過core data Notification將changes同步到其他contexts。
二、嵌套的ManagedObjectContext
1.概述: 當子Context中做保存操作時,因為子context沒有persistentStoreCoordinator,這個變化會首先推送給他的父context,這個操作將一直傳遞,直到找到沒有父Context的RootContext為止,當rootContext收到這個消息的時候,rootContext自動合并了這次操作,并且做了最終的保存。所以子context查找時,同樣也會首先從父context那里查找而不是直接與persistentStoreCoordinator交流。當使用這種結構時,不需要特別去監聽NSManagedObjectContextObjectsDidChangeNotification 來合并異步操作到主線程,這也是這種結構的方便之處。
2.對于這種結構,有三種并發策略:
策略一: 這個策略可能并不是那么好,寫在這里主要是為了與更好地備選方案進行對比。這個方案的組成部分: (1)NSMainQueueConcurrencyType類型的Main Context,此上下文與persistentStoreCoordinator進行關聯。 (2)NSPrivateQueueConcurrencyType類型的Background Context,Main Context作為它的上級Context。此Context用作數據插入和查詢。
???
策略二 : 此方案的組成部分: (1)NSPrivateQueueConcurrencyType類型的Master Context,此上下文與persistentStoreCoordinator進行關聯。 (2)NSMainQueueConcurrencyType類型的Main Context,作為Master Context的子Context。 (3)NSPrivateQueueConcurrencyType類型的Worker Context,此Context用作數據插入和查詢。
同樣使用嵌套ManagedObjectContext,但是使用PrivateQueue作為主Context。對于Worker Context作操作將會經由MainQueue Context 最終由MasterContext合并。這個方案的好處在于Worker Context都是臨時工,不需要考慮他們的生命周期。另外的一個好處是,由于他們不能自動獲取到來自父親的更新,所以這個任務可以再未完成之前隨時取消。
策略三 : 這個方案相對保守,沒有使用嵌套Context這個新的特性。 此方案的組成部分: (1)NSMainQueueConcurrencyType類型的Main Context,此上下文與persistentStoreCoordinator進行關聯。 (2)NSPrivateQueueConcurrencyType類型的Background Context,此上下文也關聯同一個persistentStoreCoordinator。
Main Context在主線程隊列,Background Context在子線程隊列。數據同步通過通知實現,每個Context都注冊NSManagedObjectContextDidSaveNotification通知,并且在收到通知后調用另一個Context的mergeChangesFromContextDidSaveNotification方法。
總結
以上是生活随笔為你收集整理的CoreData并发操作模式简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java 内存 关系_JVM和Linux
- 下一篇: jdk新特性