【问题标题】:iOS Swift Core Data How to Search FetchedObjects from an NSFetchedResultsControlleriOS Swift Core Data 如何从 NSFetchedResultsController 中搜索 FetchedObjects
【发布时间】:2019-04-08 14:31:26
【问题描述】:

我有一个名为AssetEntityAsset 有两个属性 idUUIDdataNSData。我有一个名为 fetchedAssetsControllerNSFetchedResultsController

我使用以下方法获取所有Assets

let request = Asset.fetchRequest() as NSFetchRequest<Asset>
do {
    fetchedAssetsController = NSFetchedResultsController(fetchRequest: request, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
    fetchedAssetsController.delegate = self
    try fetchedAssetsController.performFetch()           
} catch let error as NSError {
    print("Could not get Assets. Error:\(error), \(error.userInfo)")
}

我有一个 tableView,然后填充 fetchedAssetsController.fetchedObjects

我的问题是这样的;我需要能够通过他们的id搜索我的Assets,而不会影响tableView的fetchedObjects。目前,要通过 id 查找Asset,我正在执行以下操作;

func findIndexPathOfAssetByID(_ assetID: UUID) -> IndexPath? {
    for asset in fetchedAssetsController.fetchedObjects {
        if asset.id == assetID {
            return fetchedAssetsController.indexPath(forObject: asset)
        }
    }
    return nil
}

这似乎是一种非常不直观且费力的方法。我曾想过使用第二个NSFetchedResultsController 来寻找我想要的Asset id,但我相信这会覆盖我原来的TableView 使用的提取。由于我还是 CoreData 的新手,我敢肯定有一些功能我完全不知道,或者我正在以完全错误的方式处理这个问题..

实现我想做的最好的方法是什么?

【问题讨论】:

  • 迭代 fetchedObjects 不应该做任何改变,你应该能够使用 return fetchedAssetsController.fetchedObjects.filter({ $0.id == dataId }).first 使代码更短一点

标签: ios swift core-data nsfetchedresultscontroller nsfetchrequest


【解决方案1】:

更有效的方法是

func findAsset(by assetID: UUID) -> Asset? {
    return (fetchedAssetsController.fetchedObjects as! [Asset]).first{ $0.id == assetID }
}

func findIndexOfAsset(by assetID: UUID) -> Int? {
    return (fetchedAssetsController.fetchedObjects as! [Asset]).index{ $0.id == assetID }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    相关资源
    最近更新 更多