Iphone 给定一个非同步块,如何知道该块何时完成?
假设您正在使用Iphone 给定一个非同步块,如何知道该块何时完成?,iphone,objective-c,ios,cocoa-touch,objective-c-blocks,Iphone,Objective C,Ios,Cocoa Touch,Objective C Blocks,假设您正在使用ALAssetsLibraryAPI中的异步块,例如enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup*group,BOOL*stop)。首先,由于块是异步的,这是否意味着系统将在单独的执行线程上自动运行块?如果是这样,那么最好的方法是什么来知道块何时完成,以便我可以执行一些操作,例如停止UIActivityIndicator旋转或重新加载UITableView。IE类似于animateWithD
ALAssetsLibrary
API中的异步块,例如enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup*group,BOOL*stop)
。首先,由于块是异步的,这是否意味着系统将在单独的执行线程上自动运行块?如果是这样,那么最好的方法是什么来知道块何时完成,以便我可以执行一些操作,例如停止UIActivityIndicator
旋转或重新加载UITableView
。IE类似于animateWithDuration
块,它有一个完成块,允许您在动画完成时执行一些操作。在这里执行类似操作的模式是什么?块通常会在主线程上运行,您正在调用的函数是异步部分。块通常用于知道异步调用的函数何时完成。在这种特殊情况下,快速查看以下内容:
依次使用每个资源调用的块。当枚举为
完成后,调用enumerationBlock时组设置为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,但它们仍然是在后台完成的。在这个特殊的例子中,函数更多的是“回来听广播”,询问您想要为给定的组做什么,然后返回到后台 谢谢。那么,您的意思是异步方法中的块通常会在主线程上调用吗?另外,你知道你所说的后面部分的语法吗?我假设应该在块之外执行,但如果我只是坐在那里等待块何时为零,我不是否定了异步线程的优点吗?您可以在后台线程上“执行”块(NSThread performBlockInBackground将执行它),但大多数API函数的阻塞点是允许您对异步执行进行某种控制。例如,动画API将在主线程上返回一个完成块。我不熟悉这套API,所以为什么不检查一下以确定。如果您在主线程上或不在块调用中,请在NSLog()中使用[NSThread isMainThread]打印输出。检查其他问题的编辑,这是一个奇怪的约定(至少在这种情况下,对于大多数用户来说,同步调用可能更方便)。但是我想在实现方面没有比使用
nil
sigil进行虚假迭代更直接的选择了。