我的聊天应用程序中有以下对象(具有一对多关系)
@interface ChatEntry : NSManagedObject
@property (nonatomic, retain) NSString * text;
@property (nonatomic, retain) NSDate * timestamp;
@property (nonatomic, retain) ChatContext *context;
@end
@interface ChatContext : NSManagedObject
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSString * userId;
@property (nonatomic, retain) NSSet *entries;
@end
每个对话 (ChatContext) 将该用户发送的所有消息分组(由 userId 字段唯一标识)。
我正在尝试显示一个对话列表,其中显示每个对话的最后一条消息(类似于 iMessage)。
我正在使用以下代码:
NSFetchRequest* request=[[NSFetchRequest alloc] initWithEntityName:@"ChatEntry"];
request.predicate=[NSPredicate predicateWithFormat:@"timestamp=context.entries.@max.timestamp"];
request.sortDescriptors=[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"timestamp" ascending:NO]];
m_chat=[[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:m_context sectionNameKeyPath:nil cacheName:@"chat"];
m_chat.delegate=self;
这工作正常,直到我收到一条新消息(使用 NSFetchedResultsChangeInsert)
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath
{
...
}
那时,我在表格视图中获得了另一个条目。提取控制器保留前一个条目(即使它的时间戳不再是最新的)。我不确定如何解决这个问题并强制控制器始终评估谓词。
或者,我尝试更改查询以获取 ChatContext 实例,但是我不确定如何实际读取该上下文中的最新条目。