这是我的项目数据模型。
此处的数据模型适用于简单的IM应用。 1. user< - >对话(现阶段1对1) 2.对话< - >消息(1对多)
我调用以下代码来保存从web-socket收到的消息,这是一个JSON字符串。我只是简单地将它们写入Coredata实体。
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
ChatMessage* chatMessage = [ChatMessage MR_createInContext:localContext];
NSDateFormatter* formatter = [[NSDateFormatter alloc] init];
[formatter setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];
[formatter setDateFormat:@"YYYY/MM/dd HH:mm:ss"];
[chatMessage setCreateDate:[formatter dateFromString:[jsonData valueForKey:@"createDate"]]];
[chatMessage setMessageBody:[jsonData valueForKey:@"textBody"]];
[chatMessage setMessageID:[jsonData valueForKey:@"id"]];
[chatMessage setSenderID:[jsonData valueForKey:@"senderID"]];
if ( ! [[jsonData valueForKey:@"readDate"] isEqualToString:@"NULL"])
[chatMessage setReadDate:[formatter dateFromString:[jsonData valueForKey:@"readDate"]]];
else
[chatMessage setReadDate:nil];
if ([ChatConversation MR_findFirstByAttribute:@"user.userID" withValue:[jsonData valueForKey:@"senderID"]]) {
ChatConversation* conversation = [ChatConversation MR_findFirstByAttribute:@"user.userID" withValue:[jsonData valueForKey:@"senderID"] inContext:localContext];
[conversation addMessageObject:chatMessage];
}else{
ChatConversation* conversation = [ChatConversation MR_createInContext:localContext];
[conversation setConversationID:[NSString stringWithFormat:@"%ld",[[ChatConversation MR_numberOfEntities] integerValue] +1]];
[conversation addMessageObject:chatMessage];
[conversation setUser:[ChatUser MR_findFirstByAttribute:@"userID" withValue:[jsonData valueForKey:@"senderID"] inContext:localContext]];
}
} completion:^(BOOL success, NSError *error) {
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
[self displayMRRecord];
}];
当前的挑战是这个,我需要创建一个消息收件箱tableview。 像这样
“对话”按最后一条消息“createDate”排序。 所以我创建了一个UITableViewController来做到这一点。
这是我的fetchedResultsController初始化代码。
_fetchedResultsController = [ChatConversation MR_fetchAllSortedBy:@"message.createDate" ascending:TRUE withPredicate:nil groupBy:nil delegate:self];
我意识到问题是,,,
所以我真正的问题是, 如何构造一个NSFetchRequest,它通过子实体set属性的最后一个对象(最新的message.createDate)对父实体(本例中为ChatConversation)进行排序。
我用Google搜索了一整天但找不到任何有用的资源。 有没有人有处理这类问题的经验? 谢谢< 3
答案 0 :(得分:0)
天啊,我自己已经解决了。
_fetchedResultsController = [ChatConversation MR_fetchAllSortedBy:@"message.createDate" ascending:TRUE withPredicate:nil groupBy:nil delegate:self];
以错误的方式调用此行。 我应该这样说。
将所有ChatConversation实体提取到fetchResultsController.fetchedObject数组
_fetchedResultsController = [ChatConversation MR_fetchAllSortedBy:@"conversationID" ascending:TRUE withPredicate:nil groupBy:nil delegate:self];
然后简单地使用自定义NSSortDescripter对fetchedResultsController.fetchedObjects数组进行排序
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"message[LAST].createDate" ascending:YES];
NSArray *sortDescriptors1 = @[sortDescriptor];
[_fetchedResultsController.fetchedObjects sortedArrayUsingDescriptors:sortDescriptors1];