Objective-C:方法的返回值和完成块,它们是如何执行的?

时间:2014-02-18 12:54:15

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

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

的ViewController:

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

          //Some UI related code..

          [imgProcessor process:images];
     }];
}

CaptureManager:

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

     // take picture codes...

     completionHandler();

     return arrayOfImagesTaken;
}

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

谢谢!

2 个答案:

答案 0 :(得分:9)

您无需返回值图像。您可以将其作为cmpletionHandler块的参数传递。

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

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

您可以这样称呼它:

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

它如何运作?

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

答案 1 :(得分:0)

由于takeMultipleImagesWithCompletion同步执行完成块,因此不需要完成块。它只能返回arrayOfImagesTaken,并且调用者可以随意使用它。