CollectionView.reloadData() 以不正确的顺序输出单元格

CollectionView.reloadData() outputs cells in incorrect order

我正在开发一个应用程序,它需要在登录后同步到服务器,以获取用户创建并保存到服务器的所有活动。当前,当用户登录 getActivity() 函数时,该函数会发出 API 请求和 return 响应,然后进行处理。

假设用户按此顺序在服务器上保存了 4 个活动(顺序由 activity 创建/保存的时间决定);

查看 JSONHandler.getActivityResponse ,结果似乎顺序正确。如果请求成功,在要显示这些活动的主页上,我目前是这样循环的;

WebAPIHandler.shared.getActivityRequest(completion:
        {
            success, results in DispatchQueue.main.async {
                    if(success)
                    {
                        for _ in (results)!
                        {
                            guard let managedObjectContext = self.managedObjectContext else { return }

                            let activity = Activity(context: managedObjectContext)

                            activity.name = results![WebAPIHandler.shared.idCount].name
                            print("activity name is - \(activity.name)")
                            WebAPIHandler.shared.idCount += 1
                        }
                    }

for 循环中的打印也按预期顺序输出;

activity name is - Optional("Test")
activity name is - Optional("Bob")
activity name is - Optional("cvb")
activity name is - Optional("Testing")

CollectionView 确实随后插入了新的单元格,但顺序似乎有误。我在主页上使用了旋转木马布局,例如 'cvb' 对象出现在列表的第一位,而 'bob' 排在列表的第三位。我正在使用以下

 func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?)
{
    switch (type)
    {
    case .insert:

        if var indexPath = newIndexPath
        {
//                    var itemCount = 0
//                    var arrayWithIndexPaths: [IndexPath] = []
//                
//                    for _ in 0..<(WebAPIHandler.shared.idCount)
//                    {
//                        itemCount += 1
//                        
//                        arrayWithIndexPaths.append(IndexPath(item: itemCount - 1, section: 0))
//                        print("itemCount = \(itemCount)")
//                }

            print("Insert object")
//                walkThroughCollectionView.insertItems(at: arrayWithIndexPaths)
            walkThroughCollectionView.reloadData()

    }

你可以明白为什么我尝试使用 collectionView.insertItems() 但这会导致错误说明:

Invalid update: invalid number of items in section 0.  The number of items contained in an existing section after the update (4) must be equal to the number of items contained in that section before the update (4), plus or minus the number of items inserted or deleted from that section (4 inserted, 0 deleted)

我看到很多其他答案都提到了 reloadData() 如何解决这个问题,但我真的卡在了这一点上。我已经使用 swift 几个月了,这是我第一次真正不知所措。我还意识到,轮播中显示的顺序也不同于传递相同数据的单独 viewController。我只是不知道为什么结果 return 以正确的顺序显示,但随后以错误的顺序显示。调用 reloadData() 后是否有办法对 collectionView 中的数据进行排序,还是我从错误的角度看这个?

任何帮助将不胜感激,干杯!

集合视图的顺序由获取的结果控制器的排序描述符指定。

通常插入新 NSManagedObject 的工作流程是

  • 将新对象插入托管对象上下文。
  • 保存上下文。这会调用委托方法 controllerWillChangeContentcontroller(:didChange:at:
  • controller(:didChange:at: 中,使用 insertItems(at: 将单元格插入集合视图,仅此而已。不要在此方法中调用 reloadData()