Pull to refresh

Comments 5

UFO just landed and posted this here
Чтобы еще сильней уменьшить количество повторяющегося кода, можно использовать протоколы. Что-нибудь наподобие

protocol EntityCreating {
init(within context: NSManagedObjectContext)
}

extension EntityCreating where Self: NSManagedObject {
init(within context: NSManagedObjectContext = CoreDataManager.instance.managedObjectContext) {
self = NSEntityDescription.insertNewObjectForEntityForName("\(Self.self)", inManagedObjectContext: context) as! Self
}
}

Далее используем

extension Customer: EntityCreating {
}

let c = Customer()
// Если надо, то
let c = Customer(within: otherCustomContext)

c.name = «ООО «Аморфофаллус»»

Про использование CoreData в многопоточном приложении: ошибка может проявиться не сразу — например, на 500-м объекте NSManagedObject, созданном и переданном из потока загрузки в основной поток из callback-а NSURLSession

Согласно документации Apple: developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/Concurrency.html)

«NSManagedObject instances are not intended to be passed between queues. Doing so can result in corruption of the data and termination of the application.»
«Экземпляры класса NSManagedObject не предполагаются быть переданными между очередями. Это может привести к нарушению данных и завершению приложения.»

Из ReadMe.txt для примеров watchOS:
developer.apple.com/library/watchos/samplecode/ThreadedCoreData/Listings/ReadMe_txt.html

«Create a separate managed object context for each thread and share a single persistent store coordinator.»
«Создавайте отдельный контекст управляемых объектов (managed object context) для каждого потока и используйте [в этих контекстах] один общий координатор постоянного хранилища (persistent store coordinator).»

Пара интересных статей на эту тему — с примерами решения:
duckrowing.com/2010/03/11/using-core-data-on-multiple-threads
www.cimgf.com/2011/05/04/core-data-and-threads-without-the-headache

Решение в этих статьях несколько отличается от примера в упомянутой выше документации (статьи 2010 года) — в документации используется parentContext и performBlock
Спасибо за комментарий, но каким боком это к статье? Многопоточность здесь вообще не рассматривается, тем более передача объектов между различными потоками.
Статья замечательная, спасибо за нее. К сожалению не могу оставлять комментарии на первую часть, по этому решил отметить важный (по моему мнению) вопрос, в дополнение к отмеченному ранее «в общем случае, может быть несколько контекстов». Кому-то может помочь при проектировании приложения.
Sign up to leave a comment.

Articles