2017-02-13 134 views
1

我試圖從coreData中獲取一些數據並將其顯示在collectionView中。很基本。我在後臺線程上執行此操作,然後調用main上的reloadData,如圖中所示。CollectionView reaload數據索引超出範圍

但問題是,有時它有效,有時它不會,給我索引超出範圍。我觀察到,當它崩潰進入集合視圖的一些委託方法,而不是viewWillAppear中

How I call it from ViewWillAppear Fetching data

編輯:Here Is the code

+1

請將您的代碼粘貼到您的問題中,而不是截圖並指明異常消息以及哪一行有異常。 – Paulw11

+0

用你的collectionview代理方法更新你的問題 –

+0

可能是你正在返回'collectionViewCell'多於你dataArray –

回答

0

夥計們感謝你的麻煩,但我設法得到我想要的東西。

我沒有解決背景問題,而是我消除了它。我想獲得的只是一個活動指標,而數據是從CoreData加載的。

並通過消除它的工作隊列,這是非常合乎邏輯的,現在我認爲是因爲我在主線程上啓動動畫並在加載完整數據後停止它。所以看起來主線「可以同時做兩件事」? :)

0

你可能有一個以上的問題。但是,第一個是你沒有初始化數據容器。代表方法將在viewWillAppear之前調用。嘗試初始化容器viewDidLoad

thumbnailsForSections = [String:[Thumbnails]]() 
+0

如果它工作了好幾次,爲什麼會這樣呢? 我初始化它時,我是GetData函數,每次我在委託方法之前輸入控制器應該被調用。但是正如上面人們所說的那樣,它是一件很有意思的事情。 我很欣賞雖然 – Loki

+0

@ user3018285幫助,因爲在willViewAppear之前崩潰發生。它肯定你有一個初始化的問題,委託在viewWillAppear之前被調用。正如我也說過你可能有不止一個問題。這是其中之一。在你前進之前解決這個問題。 – hasan83

0

核心數據不是線程安全的。您不能存儲從後臺線程檢索到的NSManagedObjects並在主線程中使用它們。

考慮在主線程上執行提取操作或使用NSFetchedResultsController。這不應該在正常情況下,即使對於大量的數據也需要很長時間。如果這需要很長時間,請仔細查看數據模型或謂詞。

如果要繼續使用後臺線程,則必須將存儲在NSManagedObject中的值複製到不同的線程安全對象(即自定義NSObject子類或字典)中。

+0

你能指點我一些文檔或例子嗎? 我敢肯定,如果我自己試試這個,我會把它搞砸:) – Loki

+0

你可以在讀取的結果控制器上閱讀蘋果的文檔 - 他們有一個很好的演練 - https://developer.apple.com/library /content/documentation/Cocoa/Conceptual/CoreData/nsfetchedresultscontroller.html。 –

+0

它也看起來像是你有一個問題,你正在將圖像存儲在覈心數據中 - 這通常是一個壞主意,因爲它將在您執行提取時將所有圖像的所有數據加載到內存中。你可以做的是將數據作爲關係存儲在一個單獨的實體中(直到你訪問它纔會被加載),然後點擊'允許外部存儲',這樣數據就在單獨的文件而不是sql文件中。看到http://stackoverflow.com/questions/16685812/how-to-store-an-image-in-core-data –