CollectionView reaload数据索引超出范围

问题描述:

我试图从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 –

伙计们感谢你的麻烦,但我设法得到我想要的东西。

我没有解决背景问题,而是我消除了它。我想获得的只是一个活动指标,而数据是从CoreData加载的。

并通过消除它的工作队列,这是非常合乎逻辑的,现在我认为是因为我在主线程上启动动画并在加载完整数据后停止它。所以看起来主线“可以同时做两件事”? :)

你可能有一个以上的问题。但是,第一个是你没有初始化数据容器。代表方法将在viewWillAppear之前调用。尝试初始化容器viewDidLoad

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

如果它工作了好几次,为什么会这样呢? 我初始化它时,我是GetData函数,每次我在委托方法之前输入控制器应该被调用。但是正如上面人们所说的那样,它是一件很有意思的事情。 我很欣赏虽然 – Loki

+0

@ user3018285帮助,因为在willViewAppear之前崩溃发生。它肯定你有一个初始化的问题,委托在viewWillAppear之前被调用。正如我也说过你可能有不止一个问题。这是其中之一。在你前进之前解决这个问题。 – hasan83

核心数据不是线程安全的。您不能存储从后台线程检索到的NSManagedObjects并在主线程中使用它们。

考虑在主线程上执行提取操作或使用NSFetchedResultsController。这不应该在正常情况下,即使对于大量的数据也需要很长时间。如果这需要很长时间,请仔细查看数据模型或谓词。

如果要继续使用后台线程,则必须将存储在NSManagedObject中的值复制到不同的线程安全对象(即自定义NSObject子类或字典)中。

+0

你能指点我一些文档或例子吗? 我敢肯定,如果我自己试试这个,我会把它搞砸:) – Loki

+0

你可以在读取的结果控制器上阅读苹果的文档 - 他们有一个很好的演练 - https://developer.apple.com/library /content/documentation/Cocoa/Conceptual/CoreData/nsfetchedresultscontroller.html。 –

+0

它也看起来像是你有一个问题,你正在将图像存储在核心数据中 - 这通常是一个坏主意,因为它将在您执行提取时将所有图像的所有数据加载到内存中。你可以做的是将数据作为关系存储在一个单独的实体中(直到你访问它才会被加载),然后点击'允许外部存储',这样数据就在单独的文件而不是sql文件中。看到http://*.com/questions/16685812/how-to-store-an-image-in-core-data –