Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 给定一个非同步块,如何知道该块何时完成?_Iphone_Objective C_Ios_Cocoa Touch_Objective C Blocks - Fatal编程技术网

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进行虚假迭代更直接的选择了。