CoreData 基礎(chǔ)(多線程)

前面那篇文章總結(jié)了CoreData的基本操作,還是基于單線程而言。其實在實際的開發(fā)中,主要還是以多線程的情況為主,需要考慮到數(shù)據(jù)同步的問題??戳司W(wǎng)絡(luò)上的資料加上自己的一些想法,想要來談?wù)劧嗑€程下并發(fā)處理CoreData的問題。


1 NSMangedObjectContext多線程

1.1 創(chuàng)建方法

進(jìn)入NSMangedObjectContext的類中,一開始看到的就是該類的三個創(chuàng)建方法。

NSManagedObjectContext類的創(chuàng)建方法

在類方法new和實例方法init的后面標(biāo)記了在iOS 9.0之后需要用實例方法initWithConcurrencyType替換,最主要的原因是前面兩個方法創(chuàng)建的上下文不是線程安全的。

NSManagedObjectContextConcurrencyType枚舉值

NSManagedObjectContextConcurrencyType 枚舉值:

NSConfinementConcurrencyType 指的是限制并發(fā)類型,是使用new和init創(chuàng)建時候的默認(rèn)值,這個類型表示的不是線程安全的。

NSPrivateQueueConcurrencyType 指的是私有并發(fā)隊列類型,是系統(tǒng)自動創(chuàng)建的隊列,不需要開發(fā)者自己創(chuàng)建。其實很直接的可以知道這個就是除了UI處理而進(jìn)行數(shù)據(jù)處理的子線程隊列。

NSMainQueueConcurrencyType 指的是主并發(fā)隊列類型,是對UI處理的線程隊列

1.2 執(zhí)行方法

在創(chuàng)建的方法中設(shè)置了隊列的類型,但是不管什么類型的隊列都是系統(tǒng)自動創(chuàng)建的,而且開發(fā)者無法獲得,只能通過以下的方法在相應(yīng)的線程中進(jìn)行操作。

多線程執(zhí)行方法

-(void)performBlock:(void(^)())block ? 異步執(zhí)行block,執(zhí)行完會立刻返回

-(void)performBlockAndWait:(void(^)())block 同步執(zhí)行block,會在執(zhí)行完block之后再向下執(zhí)行


2 數(shù)據(jù)同步

2.1 NSMergePolicyType合并政策類型

在該類中有這樣的方法,根據(jù)context的save通知來同步其他context的數(shù)據(jù)。

同步方法

這個方法的前提是類提供的三個通知:

其實context在save的操作過程中會有三個通知:

NSManagedObjectContextWillSaveNotification 將會保存時發(fā)出的通知

NSManagedObjectContextDidSaveNotification 已經(jīng)保存時發(fā)出的通知

NSManagedObjectContextObjectsDidChangeNotification 上下文已經(jīng)改變時發(fā)出的通知

跟這個方法的說明一樣,如果其他的線程的上下文lZBackgroundContext 不涉及當(dāng)前線程上下文lZCurrentContext修改的部分,那么直接會更新lZBackgroundContext中所有相關(guān)對象的數(shù)據(jù);但是一旦涉及,默認(rèn)會提示報錯,當(dāng)然兩個線程中的context具體的合并方法還是依據(jù)NSMergePolicyType合并政策類型:

NSMergePolicyType合并政策類型

NSErrorMergePolicyType :

Default policy for all managed object contexts - save returns with an error that contains the object IDs of the objects that had conflicts(NSInsertedObjectsKey, NSUpdatedObjectsKey).

默認(rèn)的政策,對所有的管理對象上下文的save保持操作中出現(xiàn)沖突(插入,更新)時返回一個包括對象ID的NSError錯誤對象。

NSMergeByPropertyStoreTrumpMergePolicyType:

This singleton policy merges conflicts between the persistent store's version of the object and the current in memory version. The merge occurs by individual property. For properties which have been changed in both the external source and in memory, the external changes trump the in memory ones.

單一政策合并持久化存儲的對象版本和當(dāng)前內(nèi)存中的版本。合并發(fā)生在屬性中,對于屬性而言會在額外的資源和內(nèi)容中都發(fā)送改變,持久化存儲中的沖突部分會覆蓋別的context中的緩存沖突部分。

NSMergeByPropertyObjectTrumpMergePolicyType:

This singleton policy merges conflicts between the persistent store's version of the object and the current in memory version. The merge occurs by individual property. For properties which have been changed in both the external source and in memory, the in memory changes trump the external ones.

和上一個政策相反,context中的緩存沖突部分會覆蓋持久化存儲中的沖突部分。

NSOverwriteMergePolicy:

?This singleton policy overwrites all state for the changed objects in conflict The current object's state is pushed upon the persistent store.

context中所有改變的部分(不僅是沖突部分)都會覆蓋持久化存儲中相對應(yīng)的部分。

NSRollbackMergePolicy:

/This singleton policy discards all state for the changed objects in conflict. The persistent store's version of the object is used.

持久化存儲中所有部分(不僅是沖突部分)都會覆蓋context中所有部分。

2.2 多個Context處理

類中有一個屬性

parentContext

其實這個屬性就是處理多個context關(guān)系,一個parentContext可以有多個childContext,但是childContext只有一個parentContext.在childContext執(zhí)行save的時候,并沒有把數(shù)據(jù)寫入存儲區(qū)中,而會調(diào)用parentContext的save方法。

在處理save的問題上:

1 判斷是否為NSMainQueueConcurrencyType主并發(fā)隊列,如果是,則執(zhí)行:

2 如果是NSPrivateQueueConcurrencyType私有并發(fā)隊列,需要考慮當(dāng)前調(diào)用線程從而來執(zhí)行save操作:


其實參考了很多資料,雖然能在一定程度上理解,但是最終還是要去閱讀一邊coreData的官方文檔。第三篇CoreData會盡量將翻譯的文檔整理。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容