【问题标题】:NSFetchedResultsController ignoring fetchLimit after update/deletionNSFetchedResultsController 在更新/删除后忽略 fetchLimit
【发布时间】:2020-06-07 18:48:10
【问题描述】:

我正在使用 CollectionView(VC1) 和 FRC 创建一个待办事项列表。

我首先在我的主页上显示 VC1(在另一个 CVC 的一部分中),项目限制设置为 3(如预览)。然后我有一个按钮,它显示 VC1 全屏 并显示项目的全部计数。

到目前为止,提取限制正常工作。但是,当我在 VC1 全屏 上时,我可以更新/删除项目,现在当我执行 collectionView.performBatchUpdates 时,我删除/更新项目以及视图的两个实例并相应地更新。但是……

如果我再添加 3 个项目,主页上的 VC1:限制不再是 3,而是 6。

如果我删除 2 个项目,主页上的 VC1:现在只显示 1 个项目,即使在 coreData 我还有另外 20 个项目。

似乎无论设置什么限制,我删除或插入多少个 collectionView 都会相应地更新。现在我应该记得每次都 fetch items 吗?

这里是一些关于我如何设置限制和更新 collectionView 的代码

lazy var fetchedResultsController: NSFetchedResultsController<TodoItem> = {

        let context = CoreDataManager.shared.persistentContainer.viewContext

        let request: NSFetchRequest<TodoItem> = TodoItem.fetchRequest()
        request.sortDescriptors = [
            NSSortDescriptor(key: "date", ascending: false)
        ]

    request.fetchLimit = mode == .fullscreen ? .max : 3

    let frc = NSFetchedResultsController(fetchRequest: request, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)

        frc.delegate = self

        do {
            try frc.performFetch()
        } catch let err {
            print(err)
        }

        return frc
    }()

// Number of items in CV
override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    let allItems = fetchedResultsController.sections?[section].numberOfObjects ?? 0
    let numberOfRows = mode == .fullscreen ? allItems : min(allItems, 3)
    return numberOfRows
}

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

    itemChanges.append((type, indexPath, newIndexPath))
}

func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {

    collectionView?.performBatchUpdates({

        for change in self.itemChanges {
            switch change.type {
            case .insert:

                self.collectionView?.insertItems(at: [change.newIndexPath!])
            case .delete:

                self.collectionView?.deleteItems(at: [change.indexPath!])
            case .update:

                self.collectionView?.reloadItems(at: [change.indexPath!])
            case .move:

                self.collectionView?.deleteItems(at: [change.indexPath!])
                self.collectionView?.insertItems(at: [change.newIndexPath!])
            @unknown default:
                return
            }
        }
    }, completion: { finished in
        self.itemChanges.removeAll()
    })
}

提前感谢您的帮助。

【问题讨论】:

    标签: ios swift core-data


    【解决方案1】:

    惰性实例化变量的闭包只执行一次

    您必须在其他地方使用适当的提取限制更改提取请求。

    【讨论】:

    • 感谢您的回答。我想到了这一点,但不确定如何在 didChange 中再次设置它。我在该函数中再次尝试了 controller.fetchRequest.fetchLimit,但是什么也没做。你有什么建议吗?谢谢
    • 更改请求后,您必须重新获取数据。
    • 另外,因为我设置了限制,当我删除大于索引 3 的项目时,CVC 在 VC1 上崩溃...这是当前代码设置所期望的,但当然不需要!
    • 好的,如果我每次删除/添加新项目时都执行一个新请求,你认为这“好”吗?或者我不应该在主屏幕和查看所有屏幕上使用相同的 VC?然后每次出现时更新VC1,限制为3?这可能有点令人困惑,我很抱歉
    • 显然是试图在主页上预览 3 个项目,这导致了整个问题
    猜你喜欢
    • 2011-06-18
    • 2012-02-19
    • 2019-08-14
    • 2017-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多