一位同事和我正在研究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]];
答案 0 :(得分:0)
NSFetchedResultsController只会对-save:在NSManagedObjectContext上调用做出反应。因此,如果您没有保存新创建的实体,则可能不会看到此方法。
您必须在上下文更改后重新获取。回到使用NSFetchedResultsController,您可以: - (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { [self.fetchedResultsController performFetch:&error]; [self.tableView reloadData]; }
此外,核心数据的一般规则是每个线程一个受管对象上下文,每个MOC一个线程。考虑到这一点,您需要在主线程上执行Fetched Results Controller的获取,因为这是将与FRC的托管对象进行交互的线程。