NSPredicate收集最新产品

时间:2012-07-19 22:07:13

标签: objective-c ios core-data nspredicate

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

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

1 个答案:

答案 0 :(得分:0)

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