Я хочу получить доступ к вновь созданному объекту в другом managedObjectContext.
Одна идея, которую я попробовал, состояла в том, чтобы contextDidSaveContext(_ notification: Notification)
использовать mergeChanges(fromContextDidSave: notification)
слишком медленно (еще не сработало) при вызове моей функции. Но когда метод вызывается, слияние еще не произошло.
Поэтому я попытался просто создать новый managedObjectContext (родительский, включая дочерний), что работает. Однако с точки зрения производительности это хорошая идея?
class LogManager {
// MARK: - Properties
private var managedObjectContext: NSManagedObjectContext {
didSet {
let childManagedContext = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
// Configure managedObjectContext as child of self.managedObjectContext
childManagedContext.parent = self.managedObjectContext
self.childManagedObjectContext = childManagedContext
}
}
private var childManagedObjectContext: NSManagedObjectContext
// MARK: - Init
init(context: NSManagedObjectContext = CoreDataStack.sharedInstance.viewContext) {
self.childManagedObjectContext = context // will be overwritten (just for init without failures)
self.managedObjectContext = context
}
// MARK: - Logging Actions
/// Logs a new user goal action to the history
func userAction(_ newAction: UserActionHistory.Action, _ settingsValue: String? = nil, userVar: UserVar) {
guard let userVarContext = userVar.managedObjectContext else { return }
// Get correct context for userGoal
if managedObjectContext !== userVarContext {
self.managedObjectContext = userVarContext
}
let userActionHistory = UserActionHistory(context: childManagedObjectContext)
userActionHistory.doneAt = Date()
userActionHistory.didActionAsEnum = newAction
userActionHistory.settingsValue = settingsValue
userVar.relationship = userActionHistory
pushChangesToManagedObjectContext()
}
func xpAction(_ newAction: XPDetailHistory.Action, for object: String?, receivedXP: Int) {
// update context so that XP really get saved (in all cases)
self.managedObjectContext = CoreDataStack.sharedInstance.viewContext
// Log xp details
let xpDetailHistory = XPDetailHistory(context: childManagedObjectContext)
xpDetailHistory.doneAt = Date()
xpDetailHistory.didActionAsEnum = newAction
xpDetailHistory.receivedXP = Int16(receivedXP)
xpDetailHistory.forObject = object
pushChangesToManagedObjectContext()
}
// MARK: - Helper methods
/// Save changes
private func pushChangesToManagedObjectContext() {
childManagedObjectContext.perform({
do {
if self.childManagedObjectContext.hasChanges {
try self.childManagedObjectContext.save()
}
} catch {
let saveError = error as NSError
print("Unable to Save Changes To Main Managed Object Context")
print("\(saveError), \(saveError.localizedDescription)")
}
})
}
}
Приведенный выше код работает, но с точки зрения производительности это рекомендуемая практика?