Ios 从NSArray中删除包含指定内容的对象

Ios 从NSArray中删除包含指定内容的对象,ios,objective-c,nsmutablearray,nsdictionary,Ios,Objective C,Nsmutablearray,Nsdictionary,我有一个NSMutableArray包含PNMessage对象,它们都存储一个NSDictionary对象和一些属性(日期、频道)。我想从数组中删除keyR和keyS的值等于someString的所有对象(在同一个对象中) 我试图进行枚举,但无法运行。我知道我在NSArray中使用字典键是错误的,但我没有更好的主意。如果有人能帮我,我会非常感激 self.messagesArray = [[NSMutableArray alloc]initWithArray:message]; NSLo

我有一个
NSMutableArray
包含
PNMessage
对象,它们都存储一个
NSDictionary
对象和一些属性(日期、频道)。我想从数组中删除
keyR
keyS
的值等于
someString
的所有对象(在同一个对象中)

我试图进行枚举,但无法运行。我知道我在NSArray中使用字典键是错误的,但我没有更好的主意。如果有人能帮我,我会非常感激

  self.messagesArray = [[NSMutableArray alloc]initWithArray:message];
  NSLog(@"mutable messages: %@", self.messagesArray);

  NSMutableArray *objectsToRemove = [[NSMutableArray alloc]init];

        for (NSArray *messageObject in self.messagesArray) {
            if ([messageObject[@"keyS"] isEqual:someString] && [messageObject[@"keyR"] isEqual:someString]) {
                [objectsToRemove addObject:messageObject];
            }
        }

        if ([objectsToRemove count]>0) {
            [self.messagesArray removeObjectsInArray:objectsToRemove];
            NSLog(@"deleted: %@", objectsToRemove);
        }

    }];

最简单的方法是在
NSArray
上使用
-filteredarrayingpredicate:
进行过滤。正如在对您的问题的评论中所提到的,看起来您正在尝试对数组使用字典订阅,这不会起作用,但猜测这可能只是在您的示例中

NSPredicate *filterPredicate = [NSPredicate predicateWithBlock:^BOOL(id obj, NSDictionary *bindings) {
    PNMessage *message = (PNMessage *)obj;
    if ([message.dict[@"keyS"] isEqualToString:someString] || [message.dict[@"keyR"] isEqualToString:someString]) {
        return NO;
    }

    return YES;
}

self.messagesArray = [messages filteredArrayUsingPredicate:filterPredicate];

请记住,不能从正在枚举的对象中删除元素。解决方法是对(inti=array.length-1;i>=0;i--)执行
{检查数组并有条件地删除元素i}
。显式和向后迭代可以防止事情变得一团糟。这里有一些问题,还有一些信息缺失。一开始,您就在迭代
self.messagesArray
,并将每个元素强制转换为
NSArray
,然后尝试使用对象(用于字典,而不是数组)为它们下标。尽管如此,我怀疑这是不正确的,因为元素是不同的对象类型(
PNMessage
)。@Dima可以使用一些基本方法过滤数组中包含此精确字符串的对象:
keyR=someString\n个键=一些字符串\n
并将其从self.messagesArray中删除?@HotLicks如果我从self.messagesArray中复制一个副本并从副本中删除枚举对象,它可能会工作?是的,这和变体会工作,但反向
for
循环更简单、更快,至少对于简单的情况。在最后一行中,它不是消息而不是消息?
NSPredicate *filterPredicate = [NSPredicate predicateWithBlock:^BOOL(id obj, NSDictionary *bindings) {
    PNMessage *message = (PNMessage *)obj;
    if ([message.dict[@"keyS"] isEqualToString:someString] || [message.dict[@"keyR"] isEqualToString:someString]) {
        return NO;
    }

    return YES;
}

self.messagesArray = [messages filteredArrayUsingPredicate:filterPredicate];