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