79 lines
3.2 KiB
Swift
79 lines
3.2 KiB
Swift
//
|
||
// ClassProvider.swift
|
||
// Schedule ICTIS
|
||
//
|
||
// Created by Mironov Egor on 18.12.2024.
|
||
//
|
||
|
||
import Foundation
|
||
import CoreData
|
||
import SwiftUI
|
||
|
||
// Это класс служит посредником между View и моделью данных
|
||
// Он позволяет открыть наш файл данных чтобы записывать и извлекать значения
|
||
// Объект этого класса должен быть единственным за весь жизненный цикл приложения, чтобы не было рассинхронизации
|
||
// Для этого мы делаем его синглтоном
|
||
final class ClassProvider {
|
||
static let shared = ClassProvider()
|
||
|
||
// Это свойство для хранения открытого файла модели данных
|
||
private let persistentContainer: NSPersistentContainer
|
||
|
||
var viewContext: NSManagedObjectContext {
|
||
persistentContainer.viewContext
|
||
}
|
||
|
||
var newContext: NSManagedObjectContext {
|
||
//persistentContainer.newBackgroundContext()
|
||
//Можно использовать объявление newContext с помощью строки, которая написана выше, но вариант ниже потокобезопаснее
|
||
let context = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
|
||
context.persistentStoreCoordinator = persistentContainer.persistentStoreCoordinator
|
||
return context
|
||
}
|
||
|
||
private init() {
|
||
// Открытие файла
|
||
persistentContainer = NSPersistentContainer(name: "ClassDataModel")
|
||
if EnvironmentValues.isPreview {
|
||
persistentContainer.persistentStoreDescriptions.first?.url = .init(filePath: "/dev/null")
|
||
}
|
||
|
||
// Выставляем флаг для автоматического слияния данных из фонового контекста в основной
|
||
persistentContainer.viewContext.automaticallyMergesChangesFromParent = true
|
||
|
||
// Выполняем открытие файла с данными
|
||
persistentContainer.loadPersistentStores {_, error in
|
||
if let error {
|
||
fatalError("Unable to load store. Error: \(error)")
|
||
}
|
||
}
|
||
}
|
||
|
||
func exists(_ lesson: ClassModel, in context: NSManagedObjectContext) -> ClassModel? {
|
||
try? context.existingObject(with: lesson.objectID) as? ClassModel
|
||
}
|
||
|
||
func delete(_ lesson: ClassModel, in context: NSManagedObjectContext) throws {
|
||
if let existingClass = exists(lesson, in: context) {
|
||
context.delete(existingClass)
|
||
Task(priority: .background) {
|
||
try await context.perform {
|
||
try context.save()
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
func persist(in context: NSManagedObjectContext) throws {
|
||
if context.hasChanges {
|
||
try context.save()
|
||
}
|
||
}
|
||
}
|
||
|
||
extension EnvironmentValues {
|
||
static var isPreview: Bool {
|
||
return ProcessInfo.processInfo.environment["XCODE_RUNNING_FOR_PREVIEWS"] == "1"
|
||
}
|
||
}
|