日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Core Data 多线程操作实战篇

發布時間:2023/11/29 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Core Data 多线程操作实战篇 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近在解決百度音樂iPhone客戶端偶現數據庫操作crash的問題,順手整理了下CoreData的多線程原則,以及實際開發時應該如何遵守這些原則。

Core Data多線程操作的基本原則

  • 不允許跨線程訪問MOC: 在某一個MOC上的CRUD操作只能在它的操作線程上進行
  • 不允許跨線程訪問MO:對MO的操作只能在它所屬的MOC的操作線程上進行。需要注意的是,訪問一個FRC的fetchedObjects數組也只能在FRC所屬的MOC的操作線程上進行
  • Core Data的新版本

    所謂的新版本,其實是從iOS 5.0就開始支持了。新版本的Core Data廢棄了confinement context,替代它的是queue context。這兩種context的區別在于,使用confinement context必須自己保證CRUD操作只在創建它的線程上執行,也就是說創建這個confinement context的線程就是它的操作線程。 而使用queue context則只需要用-performBlock:或者-performBlockAndWait:方法執行CRUD操作,這些操作都被dispatch到context持有的serial _dispatchQueue上執行。

    Magical Record的新版本(coming soon)

    根據Magical Record的說明,從3.0版本起,MagicalRecord中的-MR_contextForCurrentThread將被棄用。剛開始我沒想清楚其中的原因,后來通過在github上提問,Magical Record的維護者之一tonyarnold給出的原因是:

  • Core Data已經廢棄了confinement context
  • Core Data中新的queue context內部使用serial dispatch_queue來保證線程安全
  • MR中的-MR_contextForCurrentThread方法是把一個queue context存儲在一個thread的字典里。這樣會導致調用這個方法的線程一定不是queue context的操作線程.
  • 我是這么理解的:

  • 我們使用-MR_contextForCurrentThread這個方法通常的習慣是,拿到這個方法返回的context之后,直接在這個context上進行CRUD操作。這在舊版本使用confinement context的Core Data是沒有問題的。因為這個confinement context的創建線程就是它的合法操作線程
  • 對于queue context, 如果我們繼續按照1中的方式使用這個context是有問題。原因就是tonyarnold給出的第三點。正確的做法應該是把CRUD操作都放在-performBlock:或-performBlockAndWait:中
  • 我認為,如果我們能用正確的方式使用-MR_contextForCurrentThread方法返回的context, 那么是沒有問題的
  • App中應該如何遵守Core Data的多線程操作原則

    如果你App也使用了Magical Record, 那么建議你按照官方說明上的方式替換掉它打算廢棄的API。比如用每次創建一個新的-MR_context的方式來替換掉-MR_contextForCurrentThread的使用。

    下面是我在修改百度音樂iPhone客戶端的數據庫操作時總結的幾個方法:

  • 每個入參有MO的方法

  • 自己保證(不是由調用者保證)對MO的訪問和修改在MO.managedObjectContext的操作線程上執行
  • 此方法應該僅把DB操作放在MO.managedObjectContext的操作線程上。 這么要求是為了避免修改數據庫操作之外的任務的線程安排
  • 注意,不要把FRC.fetchedObjects作為參數傳遞。對這個數組做遍歷、或者取大小等的操作必須要在FRC.managedObjectContext中進行,而僅由傳入的FRC.fetchedObjects無法獲取此信息
  • MO的category中的方法
  • -方法,沒有必要用-performBlock:或-performBlockAndWait:包起來。因為調用者應該有這樣的意識:對MO的操作需要在它所屬的MOC上進行。這點和CoreData的要求是一致的
  • +方法需要自己保證不違反線程操作原則。 這點和MagicalRecord保持一致
  • Core Data有關的Debug方式

    • -com.apple.CoreData.ConcurrencyDebug 3
    • -com.apple.CoreData.SQLDebug 3
    • -com.apple.CoreData.SyntaxColoredLogging YES

    轉載于:https://www.cnblogs.com/mindyme/p/5089454.html

    總結

    以上是生活随笔為你收集整理的Core Data 多线程操作实战篇的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。