【问题标题】:Objective-C: Method's return value and Completion block, how are they executed?Objective-C:方法的返回值和完成块,它们是如何执行的?
【发布时间】:2014-02-18 12:54:14
【问题描述】:

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

视图控制器:

-(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 拍摄的图像。但我不太明白这是如何工作的。 Bcos 在返回拍摄的图像数组之前,我调用了 completionHandler。这段代码是如何执行的?有没有更好的解决方案?

谢谢!

【问题讨论】:

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


    【解决方案1】:

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

    -(void)takeMultipleImagesWithCompletion:(void (^)(NSArray *images))completionHnadler{
    
         // take picture codes...
         completionHnadler(arrayOfImagesTaken);
    }
    

    你可以这样称呼它:

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

    它是如何工作的?

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

    【讨论】:

      【解决方案2】:

      由于您的takeMultipleImagesWithCompletion 同步执行完成块,因此不需要执行完成块。它可以只返回arrayOfImagesTaken,调用者可以对它做任何事情。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-23
        • 2012-07-09
        • 2018-02-08
        相关资源
        最近更新 更多