0

私は、最新の変更されたオブジェクトが、タイムスタンプを使用してRestKitを使用してサーバーからロードされ、MOCのアイデアに基づいてコアデータを使用してすべての変更を保存する同期プロセスに取り組んでいます。

シーケンス
1) 同期プロセスを開始し、Core Data に変更を保存する [AppDelegate]
2) プロセスが終了した後、Core Data からデータを再フェッチし、データをリロードする [ContactTableView]
3) フェッチが完了したら、入力ビューをリロードする [ContactDetailView]
4) テーブル ビューをリロードするContactDetailView [ContactDetailTV] 内の ViewContainer に配置

ビュー間でのデータの受け渡し

ContactTableView (passing object when user selects row)
--» ContactDetailView (passing object to subView in viewContainer)
    --» ContactDetailTV (displaying data of object in a tableView) 


動作する問題
ContactTableView の内部にいると、テーブル ビューが新しくフェッチされたデータでリロードされ、すべて問題ありません。

それは機能しません
ContactDetailTV の内部にいる場合 (データを見ているときにデータが変更される可能性があるため)、[self.tableView reloadData] を呼び出した後でも、ビューは ContactDetailTV の内部に古いデータを表示します。

質問
リロードが期待どおりに機能するために何が間違っているのか、何が欠けているのでしょうか?


コード

AppDelegate

- (void)startSyncProcess:(NSInteger)operationCode
{        
// Init helper
syncCount = 0;
syncProcess = 0;

switch (operationCode) 
{
    default:
        // (1) Request deleted companys from server
        [self requestDeletedCompanysFromServer];
        break;

    case 0:
        // (2) Request deleted contacts from server
        [self requestDeletedContactsFromServer];
        break;

    case 1:
        // (2) Request edited companys from server
        [self requestEditedCompanysFromServer];
        break;

    case 2:
        // (2) Request edited contacts from server
        [self requestEditedContactsFromServer];
        break;

    case 3:
        // Reload data views
        [self saveCurrentSyncTime];            

        [[NSNotificationCenter defaultCenter] postNotificationName:@"updateTableViewAfterSave" object:self];
        break;
}
}

連絡先TableView

- (void)syncContextDidSave:(NSNotification*)saveNotification 
{   
   // Handling the "updateTableViewAfterSave"-notification by refetching the data with Core Data
    NSError *error;
    if (![[self fetchedResultsController] performFetch:&error]) 
         NSLog(@"[ERROR] Saving failed with error: %@", [error userInfo]);

    [[NSNotificationCenter defaultCenter] postNotificationName:@"updateSubViewAfterSave" object:nil];
}

お問い合わせ詳細TV

- (void)updateSubViewAfterSave:(NSNotification *)saveNotification
{
    // Handling the "updateSubViewAfterSave"-notification by updating the table view that displays the data without using a fetchedResultsController
    [self.tableView reloadData];
}
4

1 に答える 1

1

Core Data からの最新データでオブジェクトを更新するには (データを再取得する場合でも、fetchedController のコンテキストがオブジェクトの「スナップショット」を保持するため)、メソッドを更新する必要がありました。

- (void)updateSubViewAfterSave:(NSNotification *)saveNotification
{
    // Handling the "updateSubViewAfterSave"-notification by updating the table view that displays the data without using a fetchedResultsController

    id appDelegate = (id)[[UIApplication sharedApplication] delegate]; 
    NSManagedObjectContext *tempContext = [appDelegate managedObjectContext];

    [tempContext refreshObject:contact mergeChanges:YES];
    [self.tableView reloadData];
}
于 2012-04-17T07:48:03.577 に答える