Ios 我如何使用魔法记录来创建&;不使用contextForCurrentThread更新对象并保存它们

Ios 我如何使用魔法记录来创建&;不使用contextForCurrentThread更新对象并保存它们,ios,core-data,rubymotion,magicalrecord,Ios,Core Data,Rubymotion,Magicalrecord,我刚刚在上读了MagicalRecord的博客文章 contextForCurrentThread已被弃用,应改用saveWithBlock,因为它为相关线程创建了一个安全的新NSManagedObjectContext 到目前为止,我一直在我的应用程序中广泛使用contextForCurrentThread。然而,我很难理解如何使用saveWithBlock,因为我的获取和保存不一定是按顺序进行的 目前我正在做的事情有: 不使用contextForCurrentThread创建和更新对象,然

我刚刚在上读了MagicalRecord的博客文章

contextForCurrentThread
已被弃用,应改用
saveWithBlock
,因为它为相关线程创建了一个安全的新
NSManagedObjectContext

到目前为止,我一直在我的应用程序中广泛使用
contextForCurrentThread
。然而,我很难理解如何使用
saveWithBlock
,因为我的获取和保存不一定是按顺序进行的

目前我正在做的事情有:


不使用
contextForCurrentThread
创建和更新对象,然后保存它们的推荐方法是什么?

因此,我使用objective C而不是RubyMotion,但您应该能够执行以下操作:

MagicalRecord.saveWithBlock(
   lambda { |localContext|
       person = Person.MR_createInContext(localContext)
       #update person stuff here
   }
)
编辑

如果以后要保存上下文,只需保留它:

// Somewhere in your ViewController, etc
NSManagedObjectContext *context = [NSManagedObjectContext MR_confinementContext];


// Somewhere else
Person *p = [Person MR_createInContext:context];

// And in yet another method
[context MR_saveToPersistentStoreAndWait];
这里的主要思想是,您只需要保留上下文,并在准备就绪时对其执行操作。如果要进行后台保存,可以使用以下方法:

[context MR_saveToPersistentStoreCompletion:^(BOOL success, NSError *error){
   //called on the main thread when save is complete
}];
这里我可能弄错了,但我认为魔法记录并没有为这个用例做好准备。 以下是我如何在纯核心数据中实现您所需的功能:

  • 创建一个独立或嵌套的上下文,并在某处(AppDelegate、singleton对象等)保留对它的引用
  • 使用和执行插入、读取、更新和删除操作
  • 使用以下命令保存上下文:

    [context performBlock:^{
        ZAssert([context save:&error], @"Save failed: %@\n%@", [error localizedDescription], [error userInfo]);
    }];
    

  • 这似乎是解决此类问题的标准方法。它在网上有很好的描述,例如..

    这是一个新api的教程: 参考文献如下:

  • 初始化

    [MagicalRecord SetupCoreDataStackWithStoreName:@“MyDatabase.sqlite”]

  • 解除锁定

    [MagicalRecord清理]

  • 插入

    Person*alex=[Person MR_createEntity];
    alex.name=@“alex”;
    alex.age=@23

  • 挑选

    /检索aNSManagedObject子类的所有
    NSArray*people=[personmr_findAll]

    //检索第一条记录
    Person*aPerson=[Person MR_findFirst]

    //有条件地检索记录并排序
    NSArray*people=[MR_findByAttribute:@“name”带值:@“alex”和Derby:@“age”升序:是]

  • 更新

    //更新检索到的实体与操作其属性一样简单
    aPerson.age=@56

  • 删除

    //删除所有记录
    [personmr_truncateAll]

    //检索单个记录后,删除该记录
    [alex MR_deleteEntity]

  • 拯救

    //对于任何要在磁盘上实际保存/更新/删除的实体,请调用以下方法
    [[NSManagedObjectContext MR_defaultContext]MR_savetopersistentstore并等待]

    //再次检查MagicalRecord repo以了解更多保存选项


  • 这不是一次创建和保存所有内容吗?我是否可以创建Person对象,然后在将来的另一个时间点保存?
    MR_-constrationcontext
    在MagicalRecord的2.2版中不可用。您推荐Github上的哪个分支?我可以在MagicalRecord的第3版中使用
    MagicalRecord.saveWithBlock
    作为后台线程来实现这一点。在主线程上使用:
    MagicalRecordStack.defaultStack.context
    。只需注意,在回答中,方法
    MR\u saveToPersistentStoreCompletion
    应该是
    MR\u saveToPersistentStoreWithCompletion
    是否手动管理线程?您确定
    person=person.MR_createInContext(localContext)
    localContext.MR_saveToPersistentStoreWithCompletion
    在同一个线程上执行吗?或者您的代码的两个部分都在主线程上执行?(这会使事情简化很多)我使用不同的线程,我正在调用
    NSManagedObjectContext.MR\u contextForCurrentThread.MR\u savetopersistentstore and wait
    。因此您不确定创建
    人员的上下文是否与执行
    MR\u savetopersistentstore with completion
    的上下文相同?MagicalRecord肯定可以处理这种情况,轻松地。看见你也应该远离数据单例,因为现在它很容易实现,但以后会给你带来疯狂的问题。在您的回答中,您写了
    ,这里的主要思想是您只需要保持上下文并执行
    ,那么假设用户访问了两个不同的视图控制器,您会将上下文保存在哪里?您可以在VCs之间传递它吗?您可以为每个新上下文创建一个新上下文。MagicalRecord可以帮助您在上下文之间合并更改,而不会让您的应用程序代理陷入困境(这会导致更大的痛苦),我是在原始问题的上下文(双关语不是有意的:)中提出的。让我们假设它如下所示:创建了一个新的上下文,在其中进行了一些更改;然后用户在不同的视图控制器之间移动;在某个时间点,用户希望在上下文中保存更改(他可能处于与创建上下文的VC不同的VC中)。这种设置允许我们不将当前上下文中的更改保存到持久存储中,例如,当用户在某个点取消时。
    
    [context MR_saveToPersistentStoreCompletion:^(BOOL success, NSError *error){
       //called on the main thread when save is complete
    }];
    
    [context performBlock:^{
        ZAssert([context save:&error], @"Save failed: %@\n%@", [error localizedDescription], [error userInfo]);
    }];