Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios CollectionView重新加载数据索引超出范围_Ios_Multithreading_Core Data_Uicollectionview - Fatal编程技术网

Ios CollectionView重新加载数据索引超出范围

Ios CollectionView重新加载数据索引超出范围,ios,multithreading,core-data,uicollectionview,Ios,Multithreading,Core Data,Uicollectionview,我正在尝试从coreData获取一些数据,并将其显示在collectionView中。非常基本。我在后台线程上执行此操作,然后在主线程上调用reloadData,如图所示 但问题是,它有时有效,有时无效,给了我超出范围的索引。我观察到,当它崩溃时,它会进入集合视图的某个委托方法,而不会出现视图 编辑:您可能有多个问题。但是,第一个问题是您没有初始化数据容器。在视图出现之前,将调用collectionView委托方法。尝试初始化viewDidLoad中的容器: thumbnailsForSec

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

但问题是,它有时有效,有时无效,给了我超出范围的索引。我观察到,当它崩溃时,它会进入集合视图的某个委托方法,而不会出现视图


编辑:

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

thumbnailsForSections = [String:[Thumbnails]]()

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

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


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

伙计们,谢谢你们的麻烦,但我成功地获得了我想要的

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


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

请将您的代码粘贴到您的问题中,而不是屏幕截图中,并指出异常消息以及出现异常的行。使用您的collectionview委派方法更新您的问题可能是您返回的
collectionViewCell
多于您的数据阵列请删除代码图像。并将代码粘贴为文本我编辑了问题。我没有删除截图,但我将代码上传到了一个存储库,并将链接粘贴到了那里。如果它工作了好几次,为什么会是从这里来的?我在初始化GetData函数时初始化了它,每次我进入控制器时都应该在委托方法之前调用该函数。但正如人们在上面所说的,这是一种共识。我感谢你的帮助though@user3018285因为崩溃发生在WillView出现之前。可以肯定的是,您在初始化时有问题,并且在视图出现之前会调用委托。我也说过你可能有不止一个问题。这是其中之一。在你继续之前先解决这个问题。你能给我指一些文档或例子吗?我敢肯定,如果我自己尝试一下,我会把事情搞砸:)你可以在fetched results controller上阅读苹果的文档-他们有一个很好的演练-。看起来你也有一个问题,你正在将图像存储在核心数据中-这通常是一个坏主意,因为当你进行操作时,它会将所有图像的所有数据加载到内存中取来您可以做的是将数据作为关系存储在单独的实体中(在访问它之前不会加载),然后单击“允许外部存储”,以便数据位于单独的文件中,而不是sql文件中。我知道这一点,但我也读到保留小数据没关系,这就是为什么我创建了非常小的缩略图。我检索它们,并根据它们的创建日期,在选择单元格时按下下一个viewController时搜索大图像。至于获取的结果控制器,我没有足够的经验(实际上没有),我想我会有点迷失在其中。不过我有一个想法要问你。当我检索缩略图时,我的应用程序使用的内存通常会增加。但是为什么当我打开控制器时它没有减少呢?顺便说一下,当我检索缩略图时,它使用了大约140mb的内存。太多了吗?