ドキュメントは少しむらがあるので、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 のコンテキスト スレッドと組み合わせて使用できますが、この少しの構文糖衣を使用してコードを少しきれいにできることを望んでいました。