1

リモートで削除されたエンティティが Core Data とデータストアから削除されないのはなぜですか? RKManagedObjectLoader の - (void)deleteCachedObjectsMissingFromResult:(RKObjectMappingResult *)result の先頭にブレークポイントを設定すると、変数 result に何も含まれていないことがわかります。

RestKit デリゲート (void)objectLoader:(RKObjectLoader *)objectLoader didLoadObjects:(NSArray *)objects にこの機能を実装することでこの問題を解決できましたが、それは私の観点では一種の汚れたコードです。RestKit / Core Data だけでそれを行う必要がありますか?! とにかく、次の実装は問題を解決します:

- (void)objectLoader:(RKObjectLoader *)objectLoader didLoadObjects:(NSArray *)objects
{

NSArray *allReservations = [Reservation findAll];  

for(Reservation *reservationRecord in allReservations) {
    if(![objects containsObject:reservationRecord]) {
        [[[[RKObjectManager sharedManager] objectStore] managedObjectContextForCurrentThread] deleteObject:reservationRecord];
    }
}
}

didLoadObjects の助けを借りずにその問題を解決するアイデアはありますか? 既存のエンティティの追加/更新は正しく機能します。

4

1 に答える 1

0

RestKit は NSManagedObjectContext のエントリのみを削除します。メソッドは NSManagedObjectContext 内のオブジェクトを編集するだけで、objectStore に保存することはありません。追加/編集/削除が完了したら、ObjectStore への変更を必ず保存してください。

- (void)objectLoader:(RKObjectLoader *)objectLoader didLoadObjects:(NSArray *)objects
{
    NSArray *allReservations = [Reservation findAll];  

    // Deleting each item in NSManagedObjectContext
    for(Reservation *reservationRecord in allReservations) {
        if(![objects containsObject:reservationRecord]) {
            [[[RKObjectManager sharedManager] objectStore] managedObjectContextForCurrentThread] deleteObject:reservationRecord];
        }
    }

    // Changes only exist in NSManagedObjectContext, delete them in the ObjectStore
    NSError *error = nil;
    if (![[[RKObjectManager sharedManager] objectStore] managedObjectContextForCurrentThread] save:&error]) 
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}
于 2012-11-25T12:50:55.507 に答える