NSArray *array = [[NSArray alloc]initWithObjects:@"a",@"b",@"c",@"d",@"e",@"f",nil];
//遍历数组元素
[array enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx,BOOL * _Nonnull stop) {
NSLog(@"obj=%@ idx=%ld",obj,idx);
}];
//如果指定了NSEnumerationConcurrent顺序,那么底层通过GCD来处理并发执行事宜,具体实现可能会用到dispatch group。也就是说,这个会用多线程来并发实现,并不保证按照顺序执行
//NSEnumerationReverse 倒序排列
[array enumerateObjectsWithOptions:NSEnumerationReverseusingBlock:^(id obj,NSUInteger idx,BOOL * _Nonnull stop) {
NSLog(@"idx=%ld, id=%@", idx, obj);
//当需要结束循环的时候,调用stop,赋予YES
if (idx ==3) {
*stop = YES;
}
}];
NSDictionary * dic = [NSDictionary dictionaryWithObjectsAndKeys:@"obj1",@"key1",@"obj2",@"key2",nil];
[dic enumerateKeysAndObjectsUsingBlock:^(id key,id value, BOOL *stop) {
NSLog(@"value for key %@ is %@ ", key, value);
if ([@"key2"isEqualToString:key]) {
*stop = YES;
}
}];
NSDictionary有一个方法叫enumerateKeysAndObjectsUsingBlock,它就一个参数就是block,这个block携带了三个参数,这将要把dictionary里面的key和value每次一组传递到block,enumerateKeysAndObjectsUsingBlock会遍历dictionary并把里面所有的key和value一组一组的展示给你,每组都会执行这个block。这其实就是传递一个block到另一个方法,在这个例子里它会带着特定参数被反复调用,直到找到一个key2的key,然后就会通过重新赋值那个BOOL *stop来停止运行,停止遍历同时停止调用block。