0

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

过程如下:

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

2)作为上述代码的一部分,我还将删除所有先前的对象并将字符串保存到“同步日志表”。因此,该表应该只剩下一个对象,例如“Mon 20:33”的字符串。 注意:这是一个新实现的功能,我认为它是问题的根源,我想要它,因为我正在使用它来填充所有设备上的标签以显示最后同步的数据,换句话说,给用户一个简单的检查所有设备是否具有相同的信息并且是最新的

3)然后通过调用保存两个更改[managedObjectContext save:&error];

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

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

然后问题开始

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 委托方法中,这些方法应该只接收来自“主表”的对象,从而抛出计数和导致错误。

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

4

1 回答 1

0
于 2012-06-01T10:38:07.913 回答