自定义NSFetchreqeust - 按子NSSet属性排序父实体[MagicalRecord + Coredata]

时间:2015-02-11 03:48:40

标签: ios core-data magicalrecord

这是我的项目数据模型。 Data model

此处的数据模型适用于简单的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。 像这样enter image description here

“对话”按最后一条消息“createDate”排序。 所以我创建了一个UITableViewController来做到这一点。

这是我的fetchedResultsController初始化代码。

    _fetchedResultsController = [ChatConversation MR_fetchAllSortedBy:@"message.createDate" ascending:TRUE withPredicate:nil groupBy:nil delegate:self];

我意识到问题是,,,

  1. message是一个NSSet,一组实体,所以message.createDate不合适
  2. 我需要创建一个自定义NSFetchRequest并使用它初始化fetchedResultsController
  3. 所以我真正的问题是, 如何构造一个NSFetchRequest,它通过子实体set属性的最后一个对象(最新的message.createDate)对父实体(本例中为ChatConversation)进行排序。

    我用Google搜索了一整天但找不到任何有用的资源。 有没有人有处理这类问题的经验? 谢谢< 3

1 个答案:

答案 0 :(得分:0)

天啊,我自己已经解决了。

   _fetchedResultsController = [ChatConversation MR_fetchAllSortedBy:@"message.createDate" ascending:TRUE withPredicate:nil groupBy:nil delegate:self];

以错误的方式调用此行。 我应该这样说。

  1. 将所有ChatConversation实体提取到fetchResultsController.fetchedObject数组

    _fetchedResultsController = [ChatConversation MR_fetchAllSortedBy:@"conversationID" ascending:TRUE withPredicate:nil groupBy:nil delegate:self];
    
  2. 然后简单地使用自定义NSSortDescripter对fetchedResultsController.fetchedObjects数组进行排序

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"message[LAST].createDate" ascending:YES];
    
    NSArray *sortDescriptors1 = @[sortDescriptor];
    
    [_fetchedResultsController.fetchedObjects sortedArrayUsingDescriptors:sortDescriptors1];