CoreData & CloudKit:切换iCloud同步开关后未立即生效问题求助
问题:切换CoreData容器后CloudKit同步未立即停用
自上次提问以来,我已取得不少进展。目前正在NSPersistentCloudKitContainer与NSPersistentContainer之间进行切换,但遇到了问题:当我关闭CloudKit同步并更新容器后,同步功能仍处于活跃状态,只有手动重启应用后,同步才会被停用。这与相关帖子评论区中部分用户描述的问题一致,但我尚未找到解决方案。以下是我的代码:
MyApp.swift
@main struct MyApp: App { @StateObject private var persistenceContainer = PersistenceController.shared var body: some Scene { WindowGroup { ContentView() .environmentObject(CoreBluetoothViewModel()) .environment(\.managedObjectContext, persistenceContainer.container.viewContext) } } }
PersistenceController
import CoreData class PersistenceController: ObservableObject{ static let shared = PersistenceController() lazy var container: NSPersistentContainer = { setupContainer() }() init() { container = setupContainer() } func updateContainer() { saveContext() container = setupContainer() saveContext() } private func setupContainer() -> NSPersistentContainer { let iCloud = UserDefaults.standard.bool(forKey: "iCloud") do { let newContainer = try PersistentContainer.getContainer(iCloud: iCloud) guard let description = newContainer.persistentStoreDescriptions.first else { fatalError("No description found") } if iCloud { newContainer.viewContext.automaticallyMergesChangesFromParent = true newContainer.viewContext.mergePolicy = NSMergeByPropertyStoreTrumpMergePolicy } else { description.setOption(true as NSNumber, forKey: NSPersistentHistoryTrackingKey) description.cloudKitContainerOptions = nil } description.setOption(true as NSNumber, forKey: NSPersistentStoreRemoteChangeNotificationPostOptionKey) newContainer.loadPersistentStores { (storeDescription, error) in if let error = error as NSError? { fatalError("Unresolved error \(error), \(error.userInfo)") } } return newContainer } catch { print(error) } fatalError("Could not setup Container") } private func saveContext() { do { try container.viewContext.save() } catch { let error = error as NSError fatalError("ERROR: \(error)") } } } final class PersistentContainer { private static var _model: NSManagedObjectModel? private static func model(name: String) throws -> NSManagedObjectModel { if _model == nil { _model = try loadModel(name: name, bundle: Bundle.main) } return _model! } private static func loadModel(name: String, bundle: Bundle) throws -> NSManagedObjectModel { guard let modelURL = bundle.url(forResource: name, withExtension: "momd") else { throw CoreDataModelError.modelURLNotFound(forResourceName: name) } guard let model = NSManagedObjectModel(contentsOf: modelURL) else { throw CoreDataModelError.modelLoadingFailed(forURL: modelURL) } return model } enum CoreDataModelError: Error { case modelURLNotFound(forResourceName: String) case modelLoadingFailed(forURL: URL) } public static func getContainer(iCloud: Bool) throws -> NSPersistentContainer { let name = "LogModel" if iCloud { return NSPersistentCloudKitContainer(name: name, managedObjectModel: try model(name: name)) } else { return NSPersistentContainer(name: name, managedObjectModel: try model(name: name)) } } }
内容的提问来源于stack exchange,提问作者luegm.dev
相关产品推荐
相关产品推荐

