gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:33:02 24 4
gpt4 key购买 nike

假设您正在使用来自 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!

编辑:

要检查 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 在主线程上运行,因为它们不是函数的“繁重”部分。他们可能会锁定您的 UI 的代码仍在后台完成。在这种特殊情况下,更多的功能是“恢复空气”并询问您要为给定的组做什么,然后它在后台返回。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com