Coredata操作Fault對象數(shù)據(jù)造成的crash [_NSFaultingMutableSet mutableCopyWithZone:]

問題描述

今天遇到一個crash招驴,是子線程操作coredata數(shù)據(jù)的時候發(fā)生的,崩潰棧如下:

Last Exception Backtrace:
0   CoreFoundation                  0x22340fea __exceptionPreprocess + 122
1   libobjc.A.dylib                 0x30c84c86 objc_exception_throw + 34
2   CoreFoundation                  0x22340a6c __NSFastEnumerationMutationHandler + 124
3   CoreFoundation                  0x222b77a4 -[NSMutableSet setSet:] + 556
4   CoreData                        0x22083d06 -[_NSFaultingMutableSet mutableCopyWithZone:] + 110
5   XXXX                            0x00286a18 -[DownloadManager removeDownloadLight:success:] (DownloadManager.m:834)
6   XXXX                            0x00287630 __49-[DownloadManager removeMultiDownload:success:]_block_invoke_2 (DownloadManager.m:984)
7   CoreFoundation                  0x2226b2b8 __53-[__NSArrayI enumerateObjectsWithOptions:usingBlock:]_block_invoke + 44
8   CoreFoundation                  0x2226430a -[__NSArrayI enumerateObjectsWithOptions:usingBlock:] + 230
9   XXXXX                           0x002875a0 __49-[DownloadManager removeMultiDownload:success:]_block_invoke (DownloadManager.m:983)
10  libdispatch.dylib               0x312152de _dispatch_call_block_and_release + 6
11  libdispatch.dylib               0x3121f37c _dispatch_root_queue_drain + 1384
12  libdispatch.dylib               0x312203be _dispatch_worker_thread3 + 90
13  libsystem_pthread.dylib         0x3137cdbc _pthread_wqthread + 664
14  libsystem_pthread.dylib         0x3137cb10 start_wqthread + 4

很明顯枷畏,是進行mutableCopy時迭代器出現(xiàn)異常掛了别厘,這種問題一般都是由于容器內(nèi)的數(shù)據(jù)發(fā)生了變化。找到crash的代碼部分拥诡,如下:

NSMutableSet *medias = [localmedia.album.medias mutableCopy];

那么表面上看這句話沒問題啊触趴,沒有別人操作medias啊。那么肯定是多線程造成的了渴肉。找找有沒有其他的線程引用了這個容器冗懦,找了半天,貌似也沒有啊仇祭。

等等披蕉,肯定是錯過了什么!
原來,這部分代碼是有嵌套關(guān)系的没讲,localmedia和album都是coredata數(shù)據(jù)庫中的一個表眯娱,即localmedia是一個視頻,這個視頻屬于一個專輯album爬凑,這個album又包涵了包括這個視頻在內(nèi)的一個視頻列表徙缴。那么在刪除一個視頻的時候,在它對應的專輯中把和這個視頻的關(guān)系也刪除了嘁信。

但是代碼中明明只是在需要的時候用GCD向主線程發(fā)送刪除localmedia的任務娜搂,并沒有操作medias這個容器啊。

這里面涉及到coredata的一個知識吱抚,fault屬性百宇。我們看下蘋果的解釋:

Faulting
Managed objects typically represent data held in a persistent store. In some situations a managed object may be a “fault”—an object whose property values have not yet been loaded from the external data store—see Faulting and Uniquing for more details. When you access persistent property values, the fault “fires” and the data is retrieved from the store automatically. This can be a comparatively expensive process (potentially requiring a round trip to the persistent store), and you may wish to avoid unnecessarily firing a fault.

也就是說,一些情況下秘豹,為了提高性能携御,蘋果對coredata的數(shù)據(jù)對象NSManagedObject進行了優(yōu)化,取到的數(shù)據(jù)其實并沒有真正加載到內(nèi)存中既绕。也就是說啄刹,在我們這個問題中,localmedia.album.medias這句話凄贩,表localMedia獲取了表album的數(shù)據(jù)誓军,然后又獲取了album所對應的所有medias,但是這時的medias并沒有真實加載到內(nèi)存中疲扎,所以當我們刪除一個localMedia時昵时,medias事實上是會發(fā)生變化的,這也就是我們在copy的時候crash的原因椒丧。因為主線程在刪除視頻壹甥,子線程還在執(zhí)行遍歷操作,造成了沖突壶熏。同時句柠,這也是為什么調(diào)用棧里打印的是_NSFaultingMutableSet的原因。

解決方案

1 第一個方案比較笨棒假,就是通過一些線程同步的方式解決溯职,比如加鎖或者dispatch_sync等方式進行同步的查找遍歷,不過這樣改動量不少帽哑。
2 在stackoverflow上找到一種方式谜酒,改動比較簡單。
http://stackoverflow.com/questions/6139989/core-data-nsoperation-crash-while-enumerating-through-and-deleting-objects/6140555#6140555

NSSet *iterItems = [NSSet setWithSet:list.items];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末祝拯,一起剝皮案震驚了整個濱河市甚带,隨后出現(xiàn)的幾起案子她肯,更是在濱河造成了極大的恐慌,老刑警劉巖鹰贵,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晴氨,死亡現(xiàn)場離奇詭異,居然都是意外死亡碉输,警方通過查閱死者的電腦和手機籽前,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來敷钾,“玉大人枝哄,你說我怎么就攤上這事∽杌模” “怎么了挠锥?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長侨赡。 經(jīng)常有香客問我蓖租,道長,這世上最難降的妖魔是什么羊壹? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任蓖宦,我火速辦了婚禮,結(jié)果婚禮上油猫,老公的妹妹穿的比我還像新娘稠茂。我一直安慰自己,他們只是感情好情妖,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布睬关。 她就那樣靜靜地躺著,像睡著了一般鲫售。 火紅的嫁衣襯著肌膚如雪共螺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天情竹,我揣著相機與錄音,去河邊找鬼匀哄。 笑死秦效,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的涎嚼。 我是一名探鬼主播阱州,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼法梯!你這毒婦竟也來了苔货?” 一聲冷哼從身側(cè)響起犀概,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎夜惭,沒想到半個月后姻灶,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡诈茧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年产喉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片敢会。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡曾沈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鸥昏,到底是詐尸還是另有隱情塞俱,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布吏垮,位于F島的核電站障涯,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏惫皱。R本人自食惡果不足惜像樊,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望旅敷。 院中可真熱鬧生棍,春花似錦、人聲如沸媳谁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晴音。三九已至柔纵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間锤躁,已是汗流浹背搁料。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留系羞,地道東北人郭计。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像椒振,于是被迫代替她去往敵國和親昭伸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容