核心数据新手来了。我试图更改NSManagedObjectContext的默认NSPersistentDocument,以便初始化并与NSMainQueueConcurrencyType一起使用。
目前,我在-windowControllerDidLoadNib:中这样做:
- (void)windowControllerDidLoadNib:(NSWindowController *)aController
{
[super windowControllerDidLoadNib:aController];
NSManagedObjectContext *newMOC = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[newMOC setPersistentStoreCoordinator:[self.managedObjectContext persistentStoreCoordinator]];
[self setManagedObjectContext:newMOC];
}这看起来挺好的。但我想知道,在-windowControllerDidLoadNib:中初始化MOC是最好的做法,还是应该放在其他地方和/或以另一种方式初始化。
谢谢你的帮助。
发布于 2014-03-23 22:37:22
首选模式是将托管对象上下文传递给子视图控制器的“传递接力棒”方法。给控制器一个托管对象上下文属性,并在呈现它们时传递它。
发布于 2017-03-18 16:41:05
我正在试验一个基于文档的CoreData应用程序的Xcode模板。模板创建一个init()覆盖,它只调用super.init()。我想在后台运行一个大型导入,因此我将其添加到document类中:
class Document: NSPersistentDocument {
private var importQueue = DispatchQueue(label: "Importer")
override init() {
super.init()
let moc = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
moc.mergePolicy = self.managedObjectContext!.mergePolicy
moc.persistentStoreCoordinator = self.managedObjectContext!.persistentStoreCoordinator
self.managedObjectContext = moc
}
func importStuff(url: URL) {
let moc = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
moc.parent = self.managedObjectContext
var count = 0
moc.performAndWait {
...
count += 1
if count % 10000 == 0 {
do {
try moc.save()
moc.reset()
}
catch {
Swift.print("save failed at record #\(count): \(error.localizedDescription)")
}
}
return true
}
do {
try moc.save()
}
catch {
Swift.print("save failed at records #\(count): \(error.localizedDescription)")
}
}
Swift.print("imported \(count) records.")
}
@IBAction func import(_ sender: Any) {
...
importQueue.async {
self.importStuff(url: url)
}
}
}在我最初的测试中,这似乎是可行的。我认为在-windowControllerDidLoadNib:中初始化一个新的MOC是可以的,但是如果将对象控制器绑定到文档MOC,那么当MOC被更改时,它们可能会执行第二次获取。在init中初始化它会在UI加载之前更快地初始化它。
https://stackoverflow.com/questions/22590885
复制相似问题