我正在开发一个需要登录后才能同步到服务器的应用程序,以获取用户已创建并保存到服务器的所有活动。当前,当用户登录发出getActivity()
函数以发出API请求并返回响应后再进行处理。
说用户已按此顺序在服务器上保存了4个活动(该顺序由创建/保存活动的时间确定);
看着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中对数据进行排序?还是我从错误的角度看呢?
任何帮助将不胜感激,欢呼!
答案 0 :(得分:0)
集合视图的顺序由获取的结果控制器的排序描述符指定。
通常,插入新NSManagedObject
的工作流程是
controllerWillChangeContent
,controller(:didChange:at:
等。controller(:didChange:at:
中,使用insertItems(at:
将单元格插入集合视图,仅此而已。请勿使用此方法调用reloadData()
。