Можно ли создать запрос на выборку для основных объектов данных в Scene Delegate для SwiftUI?

Я пытаюсь синхронизировать свои основные объекты данных с веб-сервисом, который я использую. Проблема в том, что веб-служба обновляет элементы каждый день, поэтому я пытаюсь создать запрос на выборку, чтобы сравнить кэшированные элементы с удаленными элементами и обновить кешированные элементы, если есть какие-либо изменения, удаления или добавления.

В идеале я бы хотел, чтобы эта операция была завершена до того, как пользователь войдет в приложение. Итак, я пытаюсь создать запрос на выборку внутри своего делегата сцены.

Логика такова: при загрузке приложения я анализирую элементы своего веб-сервиса json. В то же время я создаю запрос на выборку для существующих локальных основных сущностей данных, сравниваю локальные элементы с удаленными и при необходимости обновляю кэшированные элементы.

Это возможно? Будем очень признательны за любые предложения или советы о том, как и когда это делать!


person Lylaak    schedule 13.05.2020    source источник


Ответы (1)


это не так уж и сложно. У вас уже есть контекст в sceneDelegate при создании View. Просто выполните выборку.

    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
    let fetchRequest: NSFetchRequest<YourEntity> = YourEntity.fetchRequest()
    fetchRequest.sortDescriptors = []
    //fetchRequest.predicate = //some filters
    let result = try? context.fetch(fetchRequest)//it always returns an array but it may be empty. Fetch may throw if disc is unavailable or some other reasons
    //do what you need
    let contentView = ContentView().environment(\.managedObjectContext, context)

в общем, вы можете сохранить UUID как версию объекта. Каждый раз, когда вы изменяете объект в бэкэнде, вы можете обновить версию с новым UUID. Следовательно, вам нужно только проверить версии - если они отличаются, вам необходимо обновить объект. Но это только в том случае, если пользователь не может изменить объект в автономном режиме. Если он может, должна быть какая-то сложная логика для разрешения столкновений.

person Aspid    schedule 13.05.2020
comment
Спасибо. Я слишком много думал об этом. - person Lylaak; 14.05.2020