【问题标题】:Tricky Object Sorting and Removing from NSMutableArray棘手的对象排序和从 NSMutableArray 中删除
【发布时间】:2014-06-08 20:07:41
【问题描述】:

我有一个对象数组(包含一条消息),每个对象都具有相同的结构。它有一个消息属性,即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 对消息进行排序。我的实际代码无法做到这一点,它只能找到一个预定义用户的消息并将其全部删除。如果您有任何想法,请与我分享。提前致谢。

【问题讨论】:

  • 您是否从数据库中获取日期?
  • @Goppinath 是的。我将发送消息时的日期包含在字典中,并且我正在从服务器在这里检索它们。
  • 为什么不在数据库级别做所有事情?
  • @Goppinath 因为我无法访问它。我正在使用 PubNub 历史 API,据我所知,这是不可能的。

标签: ios objective-c nsmutablearray nsdictionary


【解决方案1】:

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

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

代码解决方案如下,传入您的消息数组,这将为用户提供最新消息列表。

-(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;
}

【讨论】:

  • 我可以离开-(NSArray *) GetLatestMessageListForEveryUser:(NSArray *) array { 行并更改消息数组的数组吗?
  • 是的 你可以在这行代码下面写上面的代码,`NSMutableArray *originalArray = [[NSMutableArray alloc]initWithArray:message];'在方法中使用 ordinalArray 而不是数组。
猜你喜欢
  • 1970-01-01
  • 2011-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多