0

我正在处理一个同步过程,其中使用时间戳从带有 RestKit 的服务器加载最新更改的对象,并使用基于 MOC 理念的 Core Data 保存所有更改。

顺序
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 中显示旧数据。

问题
我做错了什么或缺少什么以使重新加载按预期工作?


代码

应用委托

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

联系人表视图

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

联系DetailTV

- (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 回答