Запрос на получение базовых данных в SwiftUI: методы и примеры

В SwiftUI вы можете использовать Core Data для получения данных с помощью запросов на выборку. Вот несколько методов, которые вы можете использовать:

  1. FetchRequest: SwiftUI предоставляет оболочку свойства под названием FetchRequest, которая позволяет вам создавать запрос на выборку непосредственно в представлении SwiftUI. Вы можете указать сущность, дескрипторы сортировки и предикаты для фильтрации результатов.
@FetchRequest(entity: YourEntity.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \YourEntity.propertyName, ascending: true)], predicate: NSPredicate(format: "yourPredicate")) var results: FetchedResults<YourEntity>
  1. NSFetchedResultsController: Если вам нужен больший контроль над полученными результатами, вы можете использовать NSFetchedResultsController. Он предоставляет методы делегирования для отслеживания изменений в полученных результатах и ​​соответствующего обновления представления SwiftUI.

  2. Извлечение в ViewModel. Вы также можете выполнить запрос на выборку в отдельной ViewModel и наблюдать за результатами в представлении SwiftUI. Этот подход позволяет отделить логику получения данных от уровня представления.

class YourViewModel: ObservableObject {
    @Published var results: [YourEntity] = []
    private var cancellable: AnyCancellable?
    init() {
        fetchData()
    }
    func fetchData() {
        let request: NSFetchRequest<YourEntity> = YourEntity.fetchRequest()
        // Configure the fetch request as needed
        // ...
        cancellable = PersistenceController.shared.fetch(request)
            .replaceError(with: [])
            .receive(on: DispatchQueue.main)
            .assign(to: &$results)
    }
}
  1. Извлечение вручную. Наконец, вы можете вручную получить данные с помощью класса NSManagedObjectContext. Вы можете создать экземпляр NSFetchRequest, настроить его и выполнить запрос на выборку, используя контекст управляемого объекта.
let context = PersistenceController.shared.container.viewContext
let request: NSFetchRequest<YourEntity> = YourEntity.fetchRequest()
// Configure the fetch request as needed
// ...
do {
    let results = try context.fetch(request)
    // Process the fetched results
} catch {
    // Handle the error
}