ios - Objective-C:方法的返回值和Completion block ,它们是如何执行的?

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

我在 iPhone 中制作了一个摄影应用程序,我有这 3 个类:ViewController、CaptureManager 和 ImgProcessor。

View Controller :

-(IBAction)takePic:(id)sender{
     images = [captureManager takeMultipleImagesWithCompletion:^{

          //Some UI related code..

          [imgProcessor process:images];
     }];
}

捕捉管理器:

-(NSArray *)takeMultipleImagesWithCompletion:^(void)completionHandler{

     // take picture codes...

     completionHandler();

     return arrayOfImagesTaken;
}

到目前为止,它按预期工作:imgProcessor 处理由 captureManager 拍摄的图像。但我不太明白这是如何工作的。因为我在返回拍摄的图像数组之前调用了 completionHandler。这段代码是如何执行的?对此有更好的解决方案吗?

谢谢!

最佳答案

您不需要返回图像值。您可以将它作为 cmpletionHandler block 的参数传递。

-(void)takeMultipleImagesWithCompletion:(void (^)(NSArray *images))completionHnadler{

     // take picture codes...
     completionHnadler(arrayOfImagesTaken);
}

你可以这样调用它:

-(IBAction)takePic:(id)sender{
      [captureManager takeMultipleImagesWithCompletion:^(NSArray *images){
           [imgProcessor process:images];
     }];
}

它是如何工作的?

这里的 block 用作回调,它定义了任务完成时要执行的代码。当 takeMultipleImagesWithCompletion 完成运行时, block completionHnadler 将被调用。

关于ios - Objective-C:方法的返回值和Completion block ,它们是如何执行的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21854497/

相关文章:

javascript - 无法在Chrome v.71 iOS 12+上打开Blob文件

ios - 如何制作另一个包含剩余天数的数组

ios - 如何在 ScrollView 中隐藏和显示按钮?

objective-c - 我可以#ifdef#imports 吗?

ios - 处理 openURL : with Facebook and Google

ios - 无法加载 HTTP URL 图片

iphone - 如何在表格 View 上添加按钮作为附件?

iphone - 如何获取数组中某一项的索引

iphone - 从 AVCaptureVideoDataOutput 视频帧保存电影

objective-c - iOS批量下载多个文件