首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更改默认的NSManagedObjectContext of NSPersistentDocument

更改默认的NSManagedObjectContext of NSPersistentDocument
EN

Stack Overflow用户
提问于 2014-03-23 12:26:33
回答 2查看 319关注 0票数 3

核心数据新手来了。我试图更改NSManagedObjectContext的默认NSPersistentDocument,以便初始化并与NSMainQueueConcurrencyType一起使用。

目前,我在-windowControllerDidLoadNib:中这样做:

代码语言:javascript
复制
- (void)windowControllerDidLoadNib:(NSWindowController *)aController
{
    [super windowControllerDidLoadNib:aController];
    NSManagedObjectContext *newMOC = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
    [newMOC setPersistentStoreCoordinator:[self.managedObjectContext persistentStoreCoordinator]];
    [self setManagedObjectContext:newMOC];
}

这看起来挺好的。但我想知道,在-windowControllerDidLoadNib:中初始化MOC是最好的做法,还是应该放在其他地方和/或以另一种方式初始化。

谢谢你的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-23 22:37:22

首选模式是将托管对象上下文传递给子视图控制器的“传递接力棒”方法。给控制器一个托管对象上下文属性,并在呈现它们时传递它。

票数 0
EN

Stack Overflow用户

发布于 2017-03-18 16:41:05

我正在试验一个基于文档的CoreData应用程序的Xcode模板。模板创建一个init()覆盖,它只调用super.init()。我想在后台运行一个大型导入,因此我将其添加到document类中:

代码语言:javascript
复制
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加载之前更快地初始化它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22590885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档