Я в этом сценарии:
- Расширение моего приложения (расширение общего доступа) вставляет новую запись, используя CoreData и файл SQLite CoreData, хранящийся в общем каталоге
app group
.
- При переключении обратно в основное приложение основной контекст не обновляется.
Я использовал CoreDataStack.shared.mainContext.reset()
, но он не работает.
Мое ядро стека ядра (и мое основное приложение, и расширение приложения используют этот код):
import CoreData
public class CoreDataStack {
let appID = "xxx"
let modelFileName = "xxx"
let defaultAppGroupID = "xxx"
public static let shared = CoreDataManager()
public var mainContext: NSManagedObjectContext {
return mainPersistentContainer.viewContext
}
// MARK: - Core Data stack
lazy var managedObjectModel: NSManagedObjectModel = {
let bundle = Bundle(for: type(of: self))
let momdURL = bundle.url(forResource: modelFileName, withExtension: "momd")!
return NSManagedObjectModel(contentsOf: momdURL)!
}()
lazy var mainPersistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: modelFileName, managedObjectModel: managedObjectModel)
container.persistentStoreDescriptions = [NSPersistentStoreDescription(url: FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: defaultAppGroupID)!.appendingPathComponent("\(modelFileName).sqlite"))]
container.loadPersistentStores(completionHandler: { (_, error) in
if let error = error as NSError? {
fatalError("Unresolved error \(error), \(error.userInfo)")
}
})
return container
}()
public func saveMainContext() {
let context = mainPersistentContainer.viewContext
if context.hasChanges {
do {
try context.save()
} catch {
let nserror = error as NSError
fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
}
}
}
fileprivate func applicationDocumentsDirectory() -> URL {
let fileManager = FileManager.default
if let url = fileManager.containerURL(forSecurityApplicationGroupIdentifier: "group.io.wildcat.InfoFlow") {
return url
} else {
let urls = fileManager.urls(for: .documentDirectory, in: .userDomainMask)
return urls[0]
}
}
}