Block可以简化枚举
除了完成一般的处理程序,很多Cocoa和Cocoa Touch接口都会使用blocks去简化普通的任务,例如集合的枚举。比方说,NSArray类提供一个基本的block方法,包括以下:
- (void)enumerateObjectsUsingBlock:(void (^) (id obj, NSUInteger idx, BOOL *stop)) block;
这个方法包含单个变量(block),在这个数组里面的每一个项都能去调用一个这个block:
NSArray *array = ...
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"Object at index %lu is %@", idx, obj);
}];
这个block它本身也带有三个变量,前两个都是指向当前数组中的对象和它的下标index。第三个变量是一个bool类型的指针变量,通过这个指针变量可以停止枚举,像下面这种:
[array enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock: ^(id obj, NSUInteger idx, BOOL *stop) {
if (...) {
*stop = YES;
}
}];
同样的,我们可以通过使用enumerateObjectsWithOptions:usingBlock:方法来自定义枚举。具体的来说我们可以通过使用NSEnumerateReverse选项来倒序输出集合。
如果枚举block里面的代码对于当前的执行程序是可执行的、可集中的、安全的,那么你就可以使用NSEnumerationConcurrent选项:
[array enumerateObjectsWithOptions:NSEnumerationConcurrent using Block: ^(id obj NSUInterger idx, BOOL *sopt) {
...
}];
这个标志指示这个枚举block调用可以分散在多个线程中,如果block代码是特别处理器集中的,就可以提高潜在的性能。注意在使用这个选项的时候枚举的顺序是未知的。
字典NSDictionary累同样可以使用基础block方法,包括:
NSDictionary *dictionary = ...
[dictionary enumerateKeysAndObjectsUsingBlock: ^(id key, id obj, BOOL *stop) {
NSLog(@"key: %@,value:%@",key,obj);
}];
这些例如在使用传统的循环之类的场景中都极大的方便每一个键值部分的枚举。