controller:didChangeSection:atIndex:forChangeType:当项添加到数据库时,并不总是调用

时间:2017-04-26 10:07:36

标签: ios core-data

一位同事和我正在研究iOS的消息传递程序。我们使用Core Data存储消息。如果我理解事物的工作方式,每当新消息存储在数据库中时,因为我们已经将我们的应用程序配置为使用NSFetchedResultsController,Core Data应该告诉我们的聊天视图控制器使用该方法进行了哪些更改控制器:didChangeSection:atIndex:forChangeType :.这当时大多数,但在某些情况下,所述方法不会触发。当快速连续处理多个消息时,特别注意到这一点。即使在上述情况下,controllerDidChangeContent:也会触发,因此Core Data确实知道发生了什么。有谁知道出了什么问题?

注意:我已经设计了一种解决方法,无论何时向数据库添加新消息,都会自动发布添加的NSNotification;所述通知由聊天视图控制器观察并在适当时采取行动。这不会产生新问题。但是,我的同事很担心,因为我的解决方案颠覆了Apple打算处理数据库视图控制器通信的方式,因此可能会在未来引起意外问题。

提前感谢任何人提供的任何帮助。

UPDATE(2017-04-27):相关谓词的代码是:

//  The predicate needs to be as follows:
//  Select * WHERE (fromuser == userTelephoneNumber AND touser == friendTelephoneNumber) OR
//                 (fromuser == friendTelephoneNumber AND touser == userTelephoneNumber)

//  First condition
NSPredicate *chatFromMe   = [NSPredicate predicateWithFormat:@"fromuser == %@", self.userTelephoneNumber];
NSPredicate *chatToFriend = [NSPredicate predicateWithFormat:@"touser == %@", self.friendTelephoneNumber];
NSPredicate *chatFromMeToFriend = [NSCompoundPredicate andPredicateWithSubpredicates:@[chatFromMe, chatToFriend]];

//  Second condition
NSPredicate *chatFromFriend = [NSPredicate predicateWithFormat:@"fromuser == %@", self.friendTelephoneNumber];
NSPredicate *chatToMe       = [NSPredicate predicateWithFormat:@"touser == %@", self.userTelephoneNumber];
NSPredicate *chatFromFriendToMe = [NSCompoundPredicate andPredicateWithSubpredicates:@[chatFromFriend, chatToMe]];

NSPredicate *totalCondition = [NSCompoundPredicate orPredicateWithSubpredicates:@[chatFromMeToFriend, chatFromFriendToMe]];

1 个答案:

答案 0 :(得分:0)

NSFetchedResultsController只会对-save:在NSManagedObjectContext上调用做出反应。因此,如果您没有保存新创建的实体,则可能不会看到此方法。

您必须在上下文更改后重新获取。回到使用NSFetchedResultsController,您可以: - (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { [self.fetchedResultsController performFetch:&error]; [self.tableView reloadData]; }

此外,核心数据的一般规则是每个线程一个受管对象上下文,每个MOC一个线程。考虑到这一点,您需要在主线程上执行Fetched Results Controller的获取,因为这是将与FRC的托管对象进行交互的线程。