如何通过iCloud合并解决“CoreData:错误:严重的应用程序错误”?

时间:2012-05-29 11:21:58

标签: iphone objective-c core-data nsfetchedresultscontroller icloud

好的,所以我正处于测试我的应用程序的最后阶段,现在我遇到了一个困扰我的问题。

流程如下:

1)通过coredata更改为“主表”,链接到firstViewController中的myTableView

2)作为上述代码的一部分,我还删除所有先前的对象并将字符串保存到“同步日志表”。结果,该表应该留下一个对象,例如一个字符串。 “星期一20:33”。 注意:这是一个新实现的功能,我相信它是问题的根源,我想要它,因为我用它来填充所有设备上的标签以显示最后同步的数据,在其他用户可以轻松检查所有设备是否具有相同信息并且是最新的

3)然后通过调用[managedObjectContext save:&error];

保存这两个更改

4)在第二台设备上,一切正常,我可以更新“主表”,在调用重新加载的代码后显示在myTableView上。

注意我在第二个设备上的myTableView中显示了3行,并且在步骤1中对“主表”所做的更改不会更改第二个设备上的表视图,因为谓词是过滤结果

然后问题开始

5)第二个设备开始通过iCloud和委托方法接收更改:

- (void)mergeiCloudChanges:(NSNotification*)note forContext:(NSManagedObjectContext*)moc {
NSLog(@"AppDelegate Merge icloud changes for context");
 //***Specifically the line below!!
[moc mergeChangesFromContextDidSaveNotification:note]; 

NSNotification* refreshNotification = [NSNotification notificationWithName:@"RefreshAllViews" object:self  userInfo:[note userInfo]];

[[NSNotificationCenter defaultCenter] postNotification:refreshNotification]; 
}

代码中上面指出的行在我的firstViewController

中启动了以下方法
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
NSLog(@"I'm inside the method Controller Will Change Context");
[self.myTableView beginUpdates];
}

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
   atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
  newIndexPath:(NSIndexPath *)newIndexPath {
NSLog(@"I'm inside the method Controller did Change Object");

UITableView *tableView = self.myTableView;

switch(type) {
        // And enters in this line here
    case NSFetchedResultsChangeInsert:
        [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]
                         withRowAnimation:UITableViewRowAnimationFade];
        break;

    case NSFetchedResultsChangeDelete:
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                         withRowAnimation:UITableViewRowAnimationFade];
        break;

    case NSFetchedResultsChangeMove:
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                         withRowAnimation:UITableViewRowAnimationFade];
        [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]
                         withRowAnimation:UITableViewRowAnimationFade];
        break;
   }
}

然后我收到错误:

CoreData: error: Serious application error.  
An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:.  
Invalid update: invalid number of rows in section 0.  
The number of rows contained in an existing section after the update (3) must be equal to the number of rows contained in that section before the update (3), plus or minus the number of rows inserted or deleted from that section (1 inserted, 0 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out). with userInfo (null)

收到此错误后,myTableView不再响应,例如,它不会更新或响应滑动删除。

基本上从我的理解中,将从“同步日志表”中合并的对象(当它们不应该被插入时)插入到myTableView委托方法中,该方法应该只从“主表”接收对象,从而抛出计数并导致错误。

知道在我的情况下如何解决这个问题?任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

在tableview本身上调用insertRowsAt…deleteRowsAt…之前,需要更新您的tableview对象(即fetch controller或NSArray等)。 tableview告诉你这些数字并没有达到预期的效果 - 如果你使用的是fetch控制器,可能在你调用[moc mergeChangesFromContextDidSaveNotification:note]之后,你需要向moc发送一条保存消息,或者强制一个刷新表视图的数据对象。