Как упомянуто в ссылке, предоставленной klaudas, хорошей альтернативой является наличие одного стека, в котором сущности имеют отношения к пользователям.
Если вы хотите иметь отдельные магазины, вы можете попробовать что-то вроде этого:
class CoreDataManager {
// The rest of your class...
private(set) var persistentContainer: NSPersistentContainer?
func setupNewPersistentContainer(completionHandler: @escaping (_ success: Bool) -> Void) {
let container = NSPersistentContainer(name: "MyContainer")
// You should also handle the case where profileNumber == 0 and your store URL can't be constructed.
if Globals.profileNumber != 0 {
let alternateURL = NSPersistentContainer.defaultDirectoryURL()
let storeURL = alternateURL.appendingPathComponent("\(Globals.profileNumber)MyContainer.sqlite")
let storeDescription = NSPersistentStoreDescription(url: storeURL)
container.persistentStoreDescriptions = [storeDescription]
}
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error as NSError? {
// Handle the error.
fatalError("Unresolved error \(error), \(error.userInfo)")
}
let success: Bool = error == nil
completionHandler(success)
})
persistentContainer = container
}
// The rest of your class...
}
По сути, вы помещаете логику настройки контейнера в функцию, которую вы вызываете при первой инициализации стека, а затем при переключении учетных записей. Вы можете настроить класс так, чтобы сделать persistentContainer необязательным, или добавить флаг, который отслеживает успешную загрузку хранилища.
Есть несколько вещей, на которые стоит обратить внимание:
При таком подходе вам также необходимо обновить все выбранные контроллеры результатов и управляемые объекты, которые вы храните в памяти (поскольку их постоянное хранилище больше недоступно). Самый простой способ - сбросить весь пользовательский интерфейс при переключении.
Когда вы настраиваете новый контейнер, дождитесь обработчика завершения, прежде чем продолжить поток смены учетной записи.
Если у вас есть какие-либо ссылки на управляемые объекты, вы можете проверить, являются ли они действительными в контексте, проверив object.managedObjectContext?.persistentStoreCoordinator == context.persistentStoreCoordinator
.