#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")
}
Это сделало это для меня …. удачи!