0

由于文档有点参差不齐,我想知道是否有人可以阐明如何/何时准确使用 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 的上下文线程结合使用,但我希望能够使用这一点语法糖来使我的代码更简洁一些。

4

1 回答 1

1

你应该像这样使用它:

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

}];

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

于 2012-10-15T17:10:26.383 回答