enumerateObjectsUsingBlock:
is definitely synchronous. I just ran the same example in CodeRunner:
NSArray *myArray = @[ @1, @2, @3, @4, @5 ];
[myArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"%d", idx);
}];
NSLog(@"end");
And got the following output:
0
1
2
3
4
end