使用最新版本的 Magical Record 保存 NSManagedContext 的正确方法

Posted

技术标签:

【中文标题】使用最新版本的 Magical Record 保存 NSManagedContext 的正确方法【英文标题】:proper way to save NSManagedContext with latest version of Magical Record 【发布时间】:2013-07-19 21:09:05 【问题描述】:

为了保存我当前的NSManagedObjectContext,我使用[localContext MR_saveNestedContexts];,但我收到一个警告说该方法已被弃用。

我应该如何使用最新版本的 Magical Record(字面意思是今天,2013 年 7 月 19 日从 GitHub 提取)保存 NSManagedObjectContext

【问题讨论】:

【参考方案1】:

查看他们的文档。https://github.com/magicalpanda/MagicalRecord/blob/master/Docs/Saving-Entities.md

此外,当我过去向他们提问时,他们的反应非常好。您也可以随时尝试。

编辑:

不知道为什么我投了反对票。也许文档太混乱了。尝试使用

- (void) MR_saveToPersistentStoreWithCompletion:(MRSaveCompletionHandler)completion;

我没有使用最新版本的 MagicalRecord,但我认为这应该是正确的

    //get the context for the current thread
    //this context can be updated by anyone other process on this thread that uses the same MR_contextForCurrentThread call
    //it's a local store that can be merged to a parent store
    NSManagedObjectContext *localContext = [NSManagedObjectContext MR_contextForCurrentThread];

    //create an NSManagedObject of type YourEntity and insert it into the localContext object
    NSManagedObject *obj = [YourEntity MR_createInContext:localContext];

    //make any updates to obj

    //save the localContext async
    //this call should save all nested NSManagedObjectContexts as well (if they exist)
    [localContext  MR_saveToPersistentStoreWithCompletion:^
        //when the async save is complete, this block gets executed
        //blocks work very similarly to javascript callbacks
        //basically it's a function reference or block of code that get's packaged up and can be passed around
        //In this case, the completion block allows to to run any code after the save has been completed.
    ];

我刚开始时没有意识到的一件事是,当我创建我的实体时,它也将它插入到上下文中。这导致我不小心保存了不需要持久保存的对象。为了避免这种情况,我设置了一个子上下文,并且只在我想要持久化对象时才保存它。

self.context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
self.context.parentContext = [NSManagedObjectContext MR_defaultContext];

【讨论】:

是的,不知道为什么你也得到了反对票,不是我(只是反对)。您介意再提供一行代码来实现您提到的方法吗?我仍然在学习 Objective-C 的所有语法,但并不真正理解在您输入此方法时自动完成的 withCompletion:^(BOOL Success, NSError *error)completion] ... 仅供参考 - 投反对票的不是我,但这个答案确实出现在 10k 用户的标志队列中,可能是因为仅链接的答案不被视为好*** 上的东西。始终包含足够的信息,以便如果链接断开,您的答案仍然有用。请参阅here 了解更多信息。

以上是关于使用最新版本的 Magical Record 保存 NSManagedContext 的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

Magical Record 不会保存到 SQLite 文件

更改的属性未与 Magical Record 一起保存

ios Magical Record保存在UIApplicationWillTerminateNotification上

ios Magical Record 保存在 UIApplicationWillTerminateNotification

使用 Swift 3 在 Magical Record 中保存上下文时出错

Magical Record 似乎可以保存,但如果应用程序终止,更改会丢失