(SWIFT 3) создание контекста родительского дочернего управляемого объекта

#ios #swift #core-data #swift3 #nsmanagedobjectcontext

#iOS #swift #core-данные #swift3 #nsmanagedobjectcontext

Вопрос:

У меня есть приложение для чата, которое работает в основной очереди, и я хочу повысить производительность, создав контекст управляемого родительского и дочернего объектов, где родительский объект находится в основной очереди, а дочерний — в частной очереди. Потому что, когда я отправляю много сообщений одновременно, пользовательский интерфейс немного замедляется!

проблема, с которой я столкнулся, заключается в том, что я автоматически сгенерировал свой стек coredata. и я понятия не имею, как даже получить доступ к моему контексту управляемого объекта. Может кто-нибудь дать мне небольшой совет о том, как начать.

    lazy var persistentContainer: NSPersistentContainer = {
    let container = NSPersistentContainer(name: "Reveal_Swift_3")
    container.loadPersistentStores(completionHandler: { (storeDescription, error) in
        if let error = error as NSError? {

            fatalError("Unresolved error (error), (error.userInfo)")
        }
    })
    return container
}()

// MARK: - Core Data Saving support

func saveContext () {
    let context = persistentContainer.viewContext
    if context.hasChanges {
        do {
            try context.save()
        } catch {
            let nserror = error as NSError
            fatalError("Unresolved error (nserror), (nserror.userInfo)")
        }
    }
}
  

Ответ №1:

Используйте persistentContainer.viewContext для вашего пользовательского интерфейса и persistentContainer.performBackgroundTask(block:) для фоновых задач.

Ответ №2:

Использование:

                  persistentContainer.newBackgroundContext() 
  

Вместо:

                   persistentContainer.viewContext()
  

newBackgroundContext() создает частный управляемый контекст.

Вот как вы можете создать контекст:

     var privateUserContext : NSManagedObjectContext {
        get {
            return userPersistentContainer.newBackgroundContext()
        }
    }
  

И каждый раз, когда вы его используете, вы можете сохранить его таким образом.

                     do{
                         try privateUserMOC.save()

                    }
                    catch{
                         print("Error")
                    }
  

Это сделало это для меня …. удачи!