Базовый поток фоновых данных, возвращающий вставленный NSManagedObject - PullRequest
0 голосов
/ 25 октября 2018

В моем приложении я использую NSPersistantContainer с двумя NSManagedObjectContexts (viewContext и фоновый контекст).Все мои операции чтения выполняются в контексте представления, тогда как все мои операции записи выполняются в фоновом контексте (как показано ниже).

Создание нового класса Animal

class func new(_ eid: String) {
    //Create Animal Entity
    let container = CoreDataService.persistentContainer
    container.performBackgroundTask { (context) in
        let mo = Animal(context: context)
        mo.eid = eid
        mo.lastModified = Date()
        mo.purchaseDate = Date()
        mo.uuid = UUID()

        do {
            try context.save()
        }
        catch let error {
            print(error)
        }
    }
}

Проблема, с которой я столкнулся, заключается в том, что мне нужно вернуть вновь созданный NSManagedObject ( Animal ) обратно в класс менеджера, где был вызван Animal.new (eid) , чтобыиспользуется для отображения свойств объекта.

Я экспериментировал с использованием обработчика завершения, но имел проблемы с возвратом значения, как при использовании фонового NSManagedObject в основном потоке.

Использованиевозможная новая функция

Animal.new(eid) { (animal) in
if let animal = animal {

}

Каков наилучший подход для возврата вновь созданного NSManagedObject, созданного в фоновом контексте?

1 Ответ

0 голосов
/ 25 октября 2018

Что я делаю, так это чтобы мои управляемые объекты CoreData оставались в моем классе CoreDataManager, а не оставлялись в доступе для остальной части моей инфраструктуры.Таким образом, методы, которые должны создать один или несколько управляемых объектов, будут принимать данные как неуправляемый объект, а затем создавать управляемый объект, но не возвращать его (так как вызывающие объекты уже имеют неуправляемый объект).При извлечении из CoreDataManager я бы создал и заполнил неуправляемый объект (ы) и возвратил его.

Теперь часть того, почему я делаю это, заключается в том, что я использую CoreData в платформе, так что яЯ никогда не хочу передавать управляемый объект клиентскому приложению моей платформы.Но это также решает и другие проблемы, подобные той, что вы описали.

(Когда я пишу приложения, я использую Realm, и эти объекты могут переходить прямо в классы пользовательского интерфейса приложения, потому что Realm намного проще в управлении.:)

...