【问题标题】:CollectionView realoadData index out of rangeCollectionView reloadData 索引超出范围
【发布时间】:2017-07-01 09:33:30
【问题描述】:

我正在尝试从 coreData 中获取一些数据并将其显示在 collectionView 中。很基本。我在后台线程上执行此操作,然后在主线程上调用 reloadData,如图所示。

但问题是有时它有效,有时它不,让我的索引超出范围。我观察到,当它崩溃时,它会进入一些集合视图的委托方法,而不是 viewWillAppear

编辑:Here Is the code

【问题讨论】:

  • 请将您的代码粘贴到您的问题中,而不是屏幕截图,并指出异常消息以及哪一行有异常。
  • 用你的collectionview delegates方法更新你的问题
  • 可能你返回的collectionViewCell 比你返回的数据数组多
  • 请删除代码图像。并将代码粘贴为文本
  • 我编辑了这个问题。我没有删除屏幕截图,但我将代码上传到存储库并将链接粘贴到那里。

标签: ios multithreading core-data uicollectionview


【解决方案1】:

各位,谢谢你们的麻烦,但我设法得到了我想要的。

我没有解决背景问题,而是消除了它。我想要获得的只是在从 CoreData 加载数据时播放的活动指示器。

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 你能给我一些文档或例子吗?我敢肯定,如果我自己尝试这个,我会搞砸的:)
    • 您可以在 fetched results controller 上阅读苹果的文档 - 他们有一个很好的演练 - developer.apple.com/library/content/documentation/Cocoa/…
    • 您似乎也遇到了将图像存储在核心数据中的问题 - 这通常是一个坏主意,因为它会在您进行提取时将所有图像的所有数据加载到内存中.您可以做的是将数据作为关系存储在单独的实体中(在您访问它之前不会加载),然后单击“允许外部存储”,以便数据位于单独的文件中,而不是 sql 文件中。见stackoverflow.com/questions/16685812/…
    • 我知道这一点,但我也读到保留小数据没关系,这就是我创建非常小的缩略图的原因。我检索它们并根据它们的创建日期在选择单元格时按下下一个 viewController 时搜索大图像。至于获取的结果控制器,我没有足够的经验(实际上没有),我想我会有点迷失。
    • 我有一个想法要问你。当我检索缩略图时,我的应用程序使用的内存通常会增加。但是为什么当我弹出控制器时它没有减少?顺便说一句,当我检索它使用大约 140mb 的缩略图时,它现在是这样的。是不是太多了?
    【解决方案3】:

    您可能有不止一个问题。但是,第一个是您没有初始化数据容器。 collectionView 委托方法将在 viewWillAppear 之前被调用。尝试初始化viewDidLoad中的容器:

    thumbnailsForSections = [String:[Thumbnails]]()
    

    【讨论】:

    • 如果它工作了好几次,为什么会是这个?当我使用 GetData 函数时初始化它,每次我在委托方法之前进入控制器时都应该调用该函数。但正如人们在上面所说的那样,这是有一致性的。我感谢您的帮助
    • @user3018285 因为崩溃发生在 willViewAppear 之前。可以肯定的是,您在 viewWillAppear 之前调用了初始化和委托。正如我也说过的,你可能有不止一个问题。这是其中之一。在继续之前先解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多