10

我刚刚阅读了 MagicalRecord 的作者关于为什么 contextForCurrentThread 在 MagicalRecord 中不起作用的博客文章。

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

contextForCurrentThread到目前为止,我一直在我的应用程序中广泛使用。但是,我无法弄清楚如何使用saveWithBlock,因为我的获取和保存不一定按顺序进行。

目前我正在做类似的事情:

localContext = NSManagedObjectContext.MR_contextForCurrentThread
person = Person.MR_createInContext(localContext)
person.name = "John Smith"

然后用户可以浏览应用程序,显示不同的控制器、视图等。可以使用与上述代码类似的方法创建其他对象。

然后在未来的某个任意时刻,当用户决定保存时,我运行这个方法:

localContext = NSManagedObjectContext.MR_contextForCurrentThread
localContext.MR_saveToPersistentStoreWithCompletion(
  lambda { |success, error|
    # ...
  }
)

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

4

3 回答 3

18

这是新 api 的教程:http ://ablfx.com/blog/article/2 这是参考:http: //cocoadocs.org/docsets/MagicalRecord/2.1/

  1. 在里面

    [MagicalRecord setupCoreDataStackWithStoreNamed:@"MyDatabase.sqlite"];

  2. 释放

    [MagicalRecord cleanUp];

  3. 插入

    Person *alex = [Person MR_createEntity]; alex.name = @"Alex"; alex.age = @23;

  4. 选择

    /检索所有 NSManagedObject 子类 NSArray *people = [Person MR_findAll];

    //获取第一条记录 Person *aPerson = [Person MR_findFirst];

    //有条件地检索记录并排序 NSArray *people = [Person MR_findByAttribute:@"name" withValue:@"alex" andOrderBy:@"age" ascending:YES];

  5. 更新

    //更新检索到的实体就像操作它的属性一样简单 aPerson.age = @56;

  6. 删除

    //删除所有记录 [Person MR_truncateAll];

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

  7. 节省

    //对于要在磁盘上实际保存/更新/删除的任何实体调用以下方法 [[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];

    //再次检查MagicalRecord repo以获得更多保存选项

于 2014-01-11T12:56:29.520 回答
8

所以,我使用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
}];
于 2013-10-08T15:23:52.877 回答
0

我可能在这里弄错了,但我认为 Magical Record 并没有为这个用例做好准备。 这是我在纯核心数据中做你想做的事情的方法:

  1. 创建一个独立或嵌套的上下文并在某处(AppDelegate、单例对象等)保留对它的引用
  2. performBlock:使用and进行插入、读取、更新和删除操作performBlockAndWait:
  3. 保存上下文:

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

这似乎是解决这类问题的标准方法。在线很好地描述了它,例如Common Background Practices - Core Data in the Background

于 2013-10-08T18:53:24.523 回答