iphone - 给定一个异步 block ,如何知道该 block 何时完成?

标签 iphone objective-c ios cocoa-touch objective-c-blocks

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

最佳答案

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

The block to invoke using each asset in turn. When the enumeration is done, enumerationBlock is invoked with group set to 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 调用中, block 在主线程上运行,因为它们不是函数的“繁重”部分。他们可能会锁定你的用户界面的代码仍然在后台完成。在这种特殊情况下,该功能更多的是“回来呼吸空气”并询问您想要为给定的组做什么,然后它返回到后台。

关于iphone - 给定一个异步 block ,如何知道该 block 何时完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9254446/

相关文章:

objective-c - 更改 NSWindow 边框颜色

ios - 如何在 PrepareForSegue 方法中获取自定义单元格的 indexPath - iOS

ios - indexOfObjectsPassingTest 或 filteredArrayUsingPredicate 哪个性能更快?

ios - 如何在 iPhone 6 设备的 iOS 8.2 中隐藏状态栏?

iphone - 通过C与iDevice通信?

ios - CGRect 的表达式不可分配错误

ios - 之间具有透明距离的 Tableview 单元格

ios - 无法在 Carthage 依赖管理器 iOS 中从 RxSwift 导入模块

iphone - Objective C 中的部分模糊 UIImage

iphone - Apple 的 Reachability 源代码中存在严重错误? (本地 WiFi 的可达性)