@OOPER I've simplified the objective-c code when porting to swift to remove legacy work and testing pieces.
So PersistentStack.swift now appear like this:
class PersistentStack {
var modelURL: URL
var storeURL: URL
var managedObjectContext: NSManagedObjectContext
init(storeURL: URL, modelURL: URL) {
self.storeURL = storeURL
self.modelURL = modelURL
var managedObjectModel: NSManagedObjectModel {
return NSManagedObjectModel(contentsOf: modelURL)!
}
self.managedObjectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
self.managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
self.managedObjectContext.persistentStoreCoordinator = NSPersistentStoreCoordinator(managedObjectModel: managedObjectModel)
weak var psc = self.managedObjectContext.persistentStoreCoordinator
let option = [
NSMigratePersistentStoresAutomaticallyOption: NSNumber(value: true),
NSInferMappingModelAutomaticallyOption: NSNumber(value: true),
NSPersistentStoreUbiquitousContentNameKey: "iCloudStore"
] as [String: Any]
do {
try self.managedObjectContext.persistentStoreCoordinator?.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: storeURL, options: option)
self.saveContext()
Thread.sleep(forTimeInterval: 0.5)
print("DopoCloud")
let dc = NotificationCenter.default
dc.removeObserver(self)
dc.addObserver(self, selector: #selector(self.storesWillChange), name: .NSPersistentStoreCoordinatorStoresWillChange, object: psc)
dc.addObserver(self, selector: #selector(self.persistentStoreDidImportUbiquitousContentChanges), name: .NSPersistentStoreDidImportUbiquitousContentChanges, object: psc)
} catch {
print("error: \(error)")
}
}
@objc func persistentStoreDidImportUbiquitousContentChanges(_ note: Notification?) {
print("\(#function)")
if let note = note {
print("\(note)")
}
self.managedObjectContext.performAndWait {
self.managedObjectContext.mergeChanges(fromContextDidSave: note!)
if let changes = note?.userInfo {
for objID in changes {
guard let objID = objID as? NSManagedObjectID else {
continue
}
print("importing:\(objID)")
}
}
}
}
@objc func storesWillChange(_ note: Notification?) {
self.managedObjectContext.performAndWait {
if self.managedObjectContext.hasChanges {
do {
try self.managedObjectContext.save()
} catch {}
}
self.managedObjectContext.reset()
}
}
func saveContext() {
do {
try self.managedObjectContext.save()
} catch {
print("PersistenStack: Errore saving:\("\(error), \(error.localizedDescription)\n\((error as NSError).userInfo)")")
}
}
}
and this is the modified Home.swift
struct Home: View {
private let persistentStack: PersistentStack
private var notes: [Nota]?
init() {
let storeUrl = try? FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true).appendingPathComponent("iBreviary.sqlite")
let modelURL = Bundle.main.url(forResource: "iBreviary", withExtension: "momd")
self.persistentStack = PersistentStack(storeURL: storeUrl!, modelURL: modelURL!)
let fetchRequest = NSFetchRequest<Nota>()
fetchRequest.returnsObjectsAsFaults = false
let entity = NSEntityDescription.entity(forEntityName: "Nota", in: self.persistentStack.managedObjectContext)
fetchRequest.entity = entity
let sortDescriptor1 = NSSortDescriptor(key: "timestamp", ascending: false)
let sortDescriptors = [sortDescriptor1]
fetchRequest.sortDescriptors = sortDescriptors
do {
self.notes = try self.persistentStack.managedObjectContext.fetch(fetchRequest)
print(self.notes?.count)
} catch {
fatalError("Failed to fetch notes: \(error)")
}
}
var body: some View {
Text("Hello")
}
}
But count keep returning 0. Any Idea?