//** 白名单控制需求:页面数据拿到后,跟隐藏白名单比较,如果在隐藏白名单中则不展示
// 页面数据(listMArray)
NSMutableArray *listMArray = [NSMutableArray arrayWithObjects:@{@"name":@"zhangSan"}, @{@"name":@"liSi"}, @{@"name":@"wangWu"}, nil];
// 隐藏白名单(hideWhiteArray)
NSArray *hideWhiteArray = @[@"liSi", @"wangWu"];
for (NSDictionary *dict in listMArray) {
if ([hideWhiteArray containsObject:dict[@"name"]]) {
[listMArray removeObject:dict];
}
}
NSLog(@"筛选后的页面数据:%@", listMArray);
// 这种方法会crash,这是因为for in遍历的时候不能操作数据源,会报:<__NSArrayM: 0x28336f600> was mutated while being enumerated。
// 如果把遍历后的结果放到另外一个临时数组中,遍历结束后再从数据源中剔除临时数组,这样显得有点麻烦。
// 接下里看另外一种方法:for循环。
NSMutableArray *listMArray = [NSMutableArray arrayWithObjects:@{@"name":@"zhangSan"}, @{@"name":@"liSi"}, @{@"name":@"wangWu"}, nil];
NSArray *hideWhiteArray = @[@"liSi", @"wangWu"];
for (int i = 0; i < listMArray.count; i++) {
NSDictionary *dict = listMArray[i];
if ([hideWhiteArray containsObject:dict[@"name"]]) {
[listMArray removeObject:dict];
}
}
NSLog(@"筛选后的页面数据:%@", listMArray);
// 筛选后的数据是:@{@"name":@"zhangSan"}, @{@"name":@"wangWu"}
// emmmmmmmmmmmmmmmmmmmmmmmm
// 嗯,感觉逻辑没有问题,但是结果,what??
// 结果不对,卧槽,好好思考一下流程.........
// 发现是由于数据源个数发生变化后,i角标发生跳位导致,解决方法就是在每次移除数据的时候把i减少一位即可:
NSMutableArray *listMArray = [NSMutableArray arrayWithObjects:@{@"name":@"zhangSan"}, @{@"name":@"liSi"}, @{@"name":@"wangWu"}, nil];
NSArray *hideWhiteArray = @[@"liSi", @"wangWu"];
for (int i = 0; i < listMArray.count; i++) {
NSDictionary *dict = listMArray[i];
if ([hideWhiteArray containsObject:dict[@"name"]]) {
[listMArray removeObject:dict];
i -= 1;
}
}
NSLog(@"筛选后的页面数据:%@", listMArray);
// 筛选后的数据是:@{@"name":@"zhangSan"}}
// 这样就满足了需求,perfect!
// 清空字符串要使用第二种正确。
NSString *str = @"";
if (str) {
NSLog(@"有值");
} else {
NSLog(@"空");
}
NSString *str = nil;
if (str) {
NSLog(@"有值");
} else {
NSLog(@"空");
}
网友评论