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 = «ООО «Аморфофаллус»»
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 = «ООО «Аморфофаллус»»
0
Про использование 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
Согласно документации 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
0
Спасибо за комментарий, но каким боком это к статье? Многопоточность здесь вообще не рассматривается, тем более передача объектов между различными потоками.
0
Sign up to leave a comment.
Core Data + Swift для самых маленьких: необходимый минимум (часть 2)