我有两个NSSet,一个包含所有UserKeys,另一个包含在线用户键。我想在两个部分中显示这个值。第1节-在线用户和section2 -其他用户
我这样做是使用谓词,如下所示。
NSSet *nsset1 = [NSSet setWithArray:attendeesService.arrof_attendeeList]; //this are all users
nsset2 = [NSSet setWithArray:tempArray]; // temparray contains all online users.
NSSet *nsset2_ids = [nsset2 valueForKey:@"UserProfileKEY"];
nsset1_minus_nsset2 = [nsset1 filteredSetUsingPredicate:[NSPredicate predicateWithFormat:@"NOT UserProfileKEY IN %@",nsset2_ids]]; 效果很好。但是所有的用户都是关于3000+的,在线用户一次可能是200+。所以这需要很长时间。4到5个在线用户只需1分钟.因此,对于200+,在线用户将需要更多的时间。有更快的解决办法吗?
谢谢。
发布于 2015-01-19 13:40:55
您的第一个数组是FirstMakes声明是:
NSArray *FirstMakes = @[@"Mercedes-Benz", @"BMW", @"Porsche",
@"Opel", @"Volkswagen", @"Audi"];您的第二个数组是SecondMakes声明是:
NSArray *SecondMakes = @[@"Mercedes-Benz", @"Porsche",
@"Volkswagen"];
Filter `FirstMakes` to `SecondMakes`
NSPredicate *beforeL = [NSPredicate predicateWithBlock:
^BOOL(id evaluatedObject, NSDictionary *bindings)
{
if ([SecondMakes containsObject:evaluatedObject])
{
return NO;
}
else{
return YES;
}
}];
NSArray *makesBeforeL = [FirstMakes
filteredArrayUsingPredicate:beforeL];
NSLog(@"%@", makesBeforeL);您的输出是:

发布于 2015-01-19 13:39:33
使用来自minusSet的NSMutableSet
minusSet:如果存在,则从接收集中移除另一个给定集合中的每个对象。
NSMutableSet *nsset1 = [NSMutableSet setWithArray: attendeesService.arrof_attendeeList];
NSSet *set2 = [NSSet setWithArray: tempArray];
[nsset1 minusSet: set2];
NSArray *nsset1_minus_nsset2 = [nsset1 allObjects];发布于 2015-01-19 13:40:54
创建集合的代价很高-- NSSet必须一次一个地遍历一个对象的列表,要求它们计算散列,然后将它们插入桶中,这至少需要一些动态分配。
因此,如果可能的话,不要每次运行此测试时都重新创建nsset1和nsset2。在运行时将它们保持为集,即使这意味着往返于一个数组来存储到磁盘。
集上的valueForKey:也是一个集创建任务。尽量别那么做。至少切换到nsset2_ids = [NSSet setWithArray:[tempArray valueForKey:@"UserProfileKEY"]];,只创建一组而不是两组。
在NSMutableSet上使用NSMutableSet,以防止解析和应用自由形式谓词的成本。
如果可能的话,让这两个集合包含相同类型的对象,并正确地实现isEqual:和hash,这样首先就不需要转换(您通过valueForKey:实现的转换)。
https://stackoverflow.com/questions/28025771
复制相似问题