Фреймворк не запускает эти блоки в отдельном потоке.Он просто запускает их как дополнительные события в том же цикле выполнения.Чтобы доказать это, попробуйте это
[library enumerateGroupsWithTypes:ALAssetsGroupAll
usingBlock:[^(ALAssetsGroup * group, BOOL * stop)
{
if([NSThread isMainThread])
{
NSLog(@"main");
}
else
{
NSLog(@"non-main");
}
} copy]
failureBlock:^(NSError * err)
{NSLog(@"Erorr: %@", [err localizedDescription] );}];
[library release];
if([NSThread isMainThread])
{
NSLog(@"main");
}
else
{
NSLog(@"non-main");
}
Мой вывод из этого был
main
main
main
Это означает, что блок вызывался в главном потоке.Это просто отдельное событие.Чтобы решить вашу проблему, вам просто нужно как-то вернуть ваше значение изнутри блока, когда вы дойдете до последнего шага.Вы можете сказать, что это последний шаг, потому что ваш блок будет вызываться с nil для объекта группы.
EDIT: например, используйте этот блок
^(ALAssetsGroup * group, BOOL * stop)
{
if(group == nil)
{
// we've enumerated all the groups
// do something to return a value somehow (maybe send a selector to a delegate)
}
}