Основные данные iOS Swift Как искать извлеченные объекты из NSFetchedResultsController - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть Entity, называемый Asset. Asset имеет два свойства id : UUID и data : NSData. У меня есть NSFetchedResultsController с именем fetchedAssetsController .

Я получаю все 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

Моя проблема в этом; Мне нужно, чтобы также мог осуществлять поиск по моим Assets по их id , не затрагивая выбранные объекты для tableView. В настоящее время, чтобы найти Asset по id , я делаю следующее;

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, я уверен, что есть какая-то функциональность, о которой я блаженно не подозреваю или что я подхожу к этому совершенно неправильно ..

Как лучше всего добиться того, чего я добиваюсь?

1 Ответ

0 голосов
/ 05 ноября 2018

Более эффективный способ -

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 }
}
...