Учитывая асинхронный блок, как узнать, когда блок будет завершен? - PullRequest
2 голосов
/ 13 февраля 2012

Предположим, вы используете асинхронный блок из ALAssetsLibrary API, например enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop).Прежде всего, поскольку блок является асинхронным, означает ли это, что система автоматически запускает блок в отдельном потоке выполнения?Если так, то как лучше узнать, когда блок будет завершен, чтобы я мог выполнить какое-либо действие, например, остановить UIActivityIndicator от вращения или перезагрузить UITableView.IE похож на блок animateWithDuration, который имеет блок завершения, который позволяет вам выполнять некоторые действия, когда анимация завершена.Каков пример для того, чтобы сделать что-то подобное здесь?

1 Ответ

5 голосов
/ 13 февраля 2012

Блок обычно запускается в вашем основном потоке, вызываемая вами функция является асинхронной частью.Блок часто используется, чтобы знать, когда функция, которую вы вызвали асинхронно, завершена.В этом конкретном случае быстрый просмотр справочного материала говорит нам о том, что:

Блок для вызова, используя каждый актив по очереди.Когда перечисление завершено, enumerationBlock вызывается с группой, установленной на nil.

Так что в этом случае просто ищите этот nil!

РЕДАКТИРОВАТЬ:

Для проверки на ноль попробуйте что-то вроде этого

ALAssetsLibrary *lib = [ALAssetsLibrary new];
[lib enumerateGroupsWithTypes:ALAssetsGroupAll 
                   usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
                       if (group == nil) {
                           NSLog(@"Done!");
                       }
                   } 
                 failureBlock:^(NSError *error) {
                     NSLog(@"Failed...");
                 }
 ];

И если вы хотите проверить, если вы в настоящее время в основном потоке, вы можете использовать:

 NSLog("On main thread : %d",[NSThread isMainThread] ? 1:0);

При таких вызовах API блок выполняется в главном потоке, потому что они не являются «тяжелой» частью функции.Код, который потенциально может заблокировать ваш пользовательский интерфейс, все еще выполняется в фоновом режиме.В этом конкретном случае более того, что функция «возвращается в эфир» и спрашивает вас, что вы хотите сделать для данной группы, а затем возвращается в фоновый режим.

...