棘手的对象排序和从NSMutableArray中删除

时间:2014-06-08 20:07:41

标签: ios objective-c nsmutablearray nsdictionary

我有一个对象数组(包含一条消息),每个对象都有相同的结构。它有一个消息属性,NSDictionary。一本字典看起来像这样:

<message: {
    keyCreateDate = "06/08/14 21:23";
    keyMessage = Lorem ipsum;
    keyReceiverChannel = sampleString;
    keySenderUser = SampleName;
},...

我的目标是创建一个“收件箱”,我希望显示每个单元格中每个用户的最新消息。我希望节目只显示来自每个用户的最新消息,如Fb消息,What'sApp或iMessage收件箱,表视图中的每个单元格代表来自朋友的最近消息。它看起来很容易,但它比我想象的要难得多。所以我需要删除每个朋友的每条消息,但始终保持最新消息。实际上我可以从一个用户删除所有消息,但在删除其他用户时不能保持最新。是否有可能做到这一点?

我可以使用以下代码删除一个指定用户的所有消息:

    NSMutableArray *originalArray = [[NSMutableArray alloc]initWithArray:message];
    NSMutableArray *objectsToRemove = [[NSMutableArray alloc]init];
    NSMutableArray *cloneArray = [NSMutableArray arrayWithArray:originalArray];

    for (NMessage *messageObject in originalArray) {
        if ([messageObject.message[@"keySenderUser"] isEqual:usernameString]) {
            [objectsToRemove addObject:messageObject];
        }
    }

    if ([objectsToRemove count]>0) {
        [cloneArray removeObjectsInArray:objectsToRemove];
        NSLog(@"deleted: %@", objectsToRemove);
        self.messagesArray = [[NSMutableArray alloc]initWithArray:cloneArray];

我认为如果我能以某种方式向[cloneArray removeObjectsInArray:objectsToRemove];行添加一个例外,那就更容易了,它不会删除最新版本。但是,在删除它之前,我还需要根据keySenderUser对消息进行排序。我的实际代码不能这样做,它只能找到一个预定义用户的消息并删除所有这些消息。如果您有任何想法,请与我分享。提前致谢。

1 个答案:

答案 0 :(得分:0)

在您构建包含最新消息字典的新数组的情况下,我感觉自下而上更好。

解决方案如下。 1.使用日期对数组进行排序。 2.创建用于保存用户消息的新列表。 2.遍历每个对象,检查用户是否已经存在,如果没有将其添加到创建的列表中。

下面是代码解决方案,传入messaged数组,这将给出一个最新的消息列表。

-(NSArray *) GetLatestMessageListForEveryUser:(NSArray *) array
{
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    NSArray *sortedArray = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
        NSDate *obj1Date = [formatter dateFromString: [(NSDictionary *)obj1 objectForKey:@"keyCreateDate" ] ];
        NSDate *obj2Date = [formatter dateFromString:[(NSDictionary *)obj2 objectForKey:@"keyCreateDate" ] ];
        return  ([obj1Date earlierDate:obj2Date] == obj1Date);
    }];


    NSMutableArray *messageArray = [NSMutableArray array];
    NSMutableArray *usersArray = [NSMutableArray array];

    for (NSDictionary *messageDictionary in sortedArray)
    {
        NSString *userName = [messageDictionary objectForKey:@"keySenderUser"];
        if (![usersArray containsObject:userName])
        {
            [usersArray addObject:userName];
            [messageArray addObject:messageDictionary];
        }
    }
    return messageArray;
}