假设您正在使用来自ALAssetsLibrary API的异步块,例如enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop)。首先,由于块是异步的,这是否意味着系统将在单独的执行线程上自动运行该块?如果是这样,什么是知道何时完成该块的最佳方法,因此我可以执行一些操作,例如阻止UIActivityIndicator旋转或重新加载UITableView。 IE类似于animateWithDuration块,该块具有完成块,可让您在动画完成时执行某些操作。在这里做类似的事情的模式是什么?

最佳答案

块通常会在您的主线程上运行,您正在调用的函数是异步部分。该块通常用于了解您异步调用的函数何时完成。在这种特殊情况下,快速浏览reference material可以告诉我们:

依次调用使用每个资产的块。当枚举是
完成后,在组设置为nil的情况下调用enumerationBlock。

因此,在这种情况下,只需寻找零即可!

编辑:

要检查是否为零,请尝试这样的操作

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调用中,该块在主线程上运行,因为它们不是函数的“繁重”部分。他们可能会锁定您的UI的代码仍在后台执行。在这种特殊情况下,该功能不仅可以“恢复正常运行”,还可以询问您要为给定组执行的操作,然后返回后台。

10-04 23:07