假设您使用ALAssetsLibrary
API中的异步块,例如enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop)
。首先,由于块是异步的,这是否意味着系统会在单独的执行线程上自动运行块?如果是这样,了解块何时完成的最佳方法是什么,这样我就可以执行一些操作,例如阻止UIActivityIndicator
旋转或重新加载UITableView
。 IE就像animateWithDuration
块一样,它有一个完成块,允许你在动画完成时执行一些动作。在这里做类似事情的模式是什么?
答案 0 :(得分:5)
一个块通常会在你的主线程上运行,你调用的函数是异步部分。该块通常用于知道异步调用的函数何时完成。在这种特殊情况下,快速查看reference material告诉我们:
依次使用每个资产调用的块。当枚举是 完成,调用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调用中,在主线程上运行的块因为它们不是函数的“繁重”部分。他们可能会锁定您的UI的代码仍然在后台完成。在这种特殊情况下,它更多的是功能“重新回到空中”并询问你想要为给定组做些什么,然后它会在后台返回。