0

我的聊天应用程序中有以下对象(具有一对多关系)

@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 实例,但是我不确定如何实际读取该上下文中的最新条目。

4

1 回答 1

0

好的,我已经设法解决了。我所做的是在上下文中添加一个“ lastMessage ”对象,我会不断更新每条新消息。然后我查询上下文列表,按反向lastMessage.timestamp排序。新消息会在其上下文中更新lastMessage属性——这会触发一个事件并自动更新 UI。

于 2012-07-24T21:20:00.160 回答