Создать новый managedObjectContext для «копирования» объекта из другого управляемогоObjectContext? - PullRequest
0 голосов
/ 25 июня 2019

Я хочу получить доступ к вновь созданному объекту в другом 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)")
              }
          })
      }
  }

Приведенный выше код работает, но с точки зрения производительности это рекомендуемая практика?

...