给定一个异步块,如何知道块何时完成?

Ser*_*nce 2 iphone cocoa-touch objective-c ios objective-c-blocks

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

MGA*_*MGA 5

一个块通常会在你的主线程上运行,你调用的函数是异步部分.该块通常用于知道异步调用的函数何时完成.在这种特殊情况下,快速浏览参考资料告诉我们:

要依次使用每个资产调用的块.枚举完成后,调用enumerationBlock,并将group设置为nil.

所以在这种情况下只需寻找那个零!

编辑:

检查没有尝试这样的事情

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

如果你想检查你是否在主线程上是最新的,你可以使用:

 NSLog("On main thread : %d",[NSThread isMainThread] ? 1:0);
Run Code Online (Sandbox Code Playgroud)

在像这样的API调用中,在主线程上运行的块因为它们不是函数的"繁重"部分.他们可能会锁定您的UI的代码仍然在后台完成.在这种特殊情况下,它更多的是功能"重新回到空中"并询问你想要为给定组做些什么,然后它会在后台返回.