Как получить снимок из NSFetchResultsController в iOS 13? - PullRequest
0 голосов
/ 20 октября 2019

Итак, мы находимся в видео 230 WWDC 2019, и, начиная примерно с минуты 14, утверждается, что NSFetchedResultsController теперь отправляет NSDiffableDataSourceSnapshot, поэтому мы можем просто применить его непосредственно к источнику данных, доступного для преобразования (UITableViewDiffableDataSource).

Но это не совсем то, что они говорят или что мы получаем. В методе делегата controller(_:didChangeContentWith:) мы получаем NSDiffableDataSourceReference. Как перейти от этого к фактическому снимку, и какими должны быть общие типы моего источника данных?

1 Ответ

0 голосов
/ 20 октября 2019

Дифференцируемый источник данных должен быть объявлен с универсальными типами String и NSManagedObjectID. Теперь вы можете привести ссылку на снимок:

func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChangeContentWith snapshot: NSDiffableDataSourceSnapshotReference) {
    let snapshot = snapshot as NSDiffableDataSourceSnapshot<String,NSManagedObjectID>
    self.ds.apply(snapshot, animatingDifferences: false)
}

Это оставляет открытым вопрос о том, как вы собираетесь заполнять ячейку. В источнике данных с возможностью преобразования (self.ds в моем примере), когда вы заполняете ячейку, возвращаетесь в контроллер извлеченных результатов и извлекаете фактический объект данных.

Например, в моем табличном представлении я отображаюname группы в каждой ячейке:

lazy var ds : UITableViewDiffableDataSource<String,NSManagedObjectID> = {
    UITableViewDiffableDataSource(tableView: self.tableView) {
        tv,ip,id in
        let cell = tv.dequeueReusableCell(withIdentifier: self.cellID, for: ip)
        cell.accessoryType = .disclosureIndicator
        let group = self.frc.object(at: ip)
        cell.textLabel!.text = group.name
        return cell
    }
}()
...