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 に答える