gpt4 book ai didi

json - CollectionView.reloadData() 以错误的顺序输出单元格

转载 作者:行者123 更新时间:2023-11-30 11:08:47 26 4
gpt4 key购买 nike

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

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

  • 测试
  • 鲍勃
  • CVB
  • 测试

查看 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。我只是不知道为什么结果以正确的顺序返回,但随后以错误的顺序显示。有没有办法在调用 reloadData() 后对 collectionView 中的数据进行排序,还是我从错误的角度看待这个问题?

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

最佳答案

Collection View 的顺序由获取结果 Controller 的排序描述符指定。

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

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

关于json - CollectionView.reloadData() 以错误的顺序输出单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52409446/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com