使用MagicalRecord的saveInBackgroundWithBlock:with findAll

时间:2012-10-15 16:34:15

标签: objective-c core-data magicalrecord

由于文档有点不合适,我想知道是否有人可以了解如何/何时使用saveInBackgroundWithBlock。

我有一个批处理过程,我在每次启动后在后台运行以更新Core Data中的某些值。但是,当我运行这段代码(简化)时:

[MagicalRecord saveInBackgroundWithBlock:^(NSManagedObjectContext *context) {
        NSArray *all = [Event findAll];
        for (Event *event in all) {
            event.timestamp = [NSDate date];
        }
 }];

当需要保存时,上下文永远不会有任何变化。但是,当我做类似的事情时:

[MagicalRecord saveInBackgroundWithBlock:^(NSManagedObjectContext *context) {
        NSArray *all = [Event findAll];
        for (Event *event in all) {
            Event *tmpEvent = [event inContext:context];
            tmpEvent.timeStamp = [NSDate date];
        }
}];

一切都很好,变化显现出来。我看到的唯一问题是如果我使用findAll,所有事件的数据都是错误的:

(lldb) po event
(Event *) $1 = 0x07497c90 <Event: 0x7497c90> (entity: Event; id: 0x7490a50 <x-coredata://2DB960AE-FA52-42A7-9A5F-957199076FF7/Event/p1> ; data: <fault>)
(lldb) po tmpEvent
(Event *) $2 = 0x08574250 <Event: 0x8574250> (entity: Event; id: 0x7490a50 <x-coredata://2DB960AE-FA52-42A7-9A5F-957199076FF7/Event/p1> ; data: {
    name = Test;
    number = 0;
    timeStamp = "2012-10-15 16:18:39 +0000";
})

如果我不正确地使用saveInBackground,我总是可以将NSOperationQueue块操作与MagicalRecord的上下文线程结合使用,但我希望能够使用这一点语法糖来使我的代码更清洁一点。

1 个答案:

答案 0 :(得分:1)

你应该更像这样使用它:

[MagicalRecord saveInBackgroundWithBlock:^(NSManagedObjectContext *localContext){
    NSArray *all = [Event findAllInContext:localContext];
    for (Event *event in all)
    {
        event.timeStamp = [NSDate date];
    }

}];

使用背景块时,请使用一切的本地上下文。后台块正在执行从主线程/队列中执行操作所需的所有设置。因此,您应该在不是“主要”上下文的上下文中执行所有后台操作,就像MagicalRecord为您设置的那样。