1.Collection was mutated while being enumerated

遇到一個問題,跟蹤了半天才發(fā)現(xiàn)原因。(現(xiàn)象是,客戶老是說在下載的過程中,過一會就出現(xiàn)崩潰的現(xiàn)象, 只要點了下載按鈕, 不做任何操作, 然后期刊就開始正常下載了,過大概5分鐘后,再去看,程序就已經(jīng)崩潰了)

在做《時裝傳媒》ipad應(yīng)用時,首頁的下載頁面,下載時,會不斷地去更新頁面上的下載進度,同時還有一個15秒的timer, 會每15秒切換當前顯示的是男裝,女裝或者藝術(shù)刊頁面。這個timer會把當前的scrollView中顯示的封面圖片進行移除,然后再替換,以實現(xiàn)自動更換首頁封面的功能

崩潰時提示:

Collection was mutated while being enumerated

(在網(wǎng)上搜了一下,發(fā)現(xiàn)有一個類似的問題:'NSGenericException', reason: '*** Collection <__NSArrayM: 0x8ef350> was mutated while being enumerated.')

根據(jù)這個提示, 想了一下,覺得應(yīng)該在做遍歷的過程中,修改了這個NSArray或者是NSMutableArray。后來想想, 這可能是多線程并發(fā)訪問時出現(xiàn)的問題, 沿崩潰時的堆棧找了一下,果然找到。

因為我們在下載時, 使用了Block每當接受到數(shù)據(jù),就去更新一下一個UIScrollView中的下載進度條的百分比。

而另有一個NSTimer, 會隔一段時間把這個UIScrollView中的全部元素清空,然后再重新添加, 因為可能有動態(tài)的元素需要添加或者刪除。

運行時, 就會出現(xiàn),兩個線程同時去訪問的情況, 當Block正在去更新UIScrollView中的這個元素時, NSTimer中可能正在執(zhí)行清除操作,所以就崩了。

原來,在同一時間,不同的線程同時讀取和修改了NSMutaleArray。

解決辦法:避免多線程同時去修改一個對象, 避免做遍歷時,這個對象被修改,根據(jù)這個思想,可以考慮加鎖,或者直接使用atomic的方式來做。

最后編輯于
?著作權(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)容

  • WebSocket-Swift Starscream的使用 WebSocket 是 HTML5 一種新的協(xié)議。它實...
    香橙柚子閱讀 24,729評論 8 183
  • 我也終于從當初的偏執(zhí)癲狂一腔熱血 淪為了如今的 不喜不悲 心如止水 我以前倒追。 喜歡的我就要 瘋狂去爭取 去追求...
    郝氏春秋閱讀 339評論 0 0
  • 假設(shè)分支名稱為oldName想要修改為 newName 1. 本地分支重命名(還沒有推送到遠程) 2. 遠程分支重...
    我小時候可猛了_閱讀 246,202評論 8 116
  • 今天直播時聊到課堂上開黑玩游戲的事情,驚呆我也。如此大膽,冒著手機被沒收,自己被記過的風險來玩游戲真不要命了。過后...
    燕紀事閱讀 1,632評論 7 0
  • 第一次在簡書上寫文章,先扯一下這個東西。一個偶然遇到了簡書,于是就愛不釋手,感覺這是一個充滿正能量的地方,而且很有...
    雨曉知足閱讀 2,113評論 15 53

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