RestKit&核心数据 - 在表视图中重新加载嵌套在视图容器中的数据

时间:2012-04-16 14:17:44

标签: core-data notifications restkit

我正在进行同步过程,其中使用时间戳从具有RestKit的服务器加载最新更改的对象,并根据MOC构思使用Core Data保存所有更改。

序列
1)启动同步过程并将更改保存到核心数据[AppDelegate]
2)在处理完成后重新获取Core Data中的数据并重新加载数据[ContactTableView]
3)获取完成后重新加载输入视图[ContactDetailView]
4)重新加载置于ContactDetailView内的ViewContainer中的表视图[ContactDetailTV]

在视图之间传递数据

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;
}
}

ContactTableView

- (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];
}

ContactDetailTV

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

1 个答案:

答案 0 :(得分: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];
}
相关问题