免费开源的iOS开发学习平台

OC Block块:4-回调CallBack

在iOS的开发过程中,Block的回调使用非常普遍,也是Block的重要用法之一,在使用过程中经常可以用于替换代理的实现方法。例如,当一段动画播放完成后,执行一段代码,当得到请求的网络数据后,执行一段对数据的操作代码等等。这些场景中,都使用到了Block的回调机制。Block的回调机制,可以使代码的编写变得十分的清晰,提升了代码的可读性。

当我们需要定义回调Block时,通常情况下可以按照如下步骤进行:

  1. 定义带Block参数的方法;
  2. 设置Block的回调时机;
  3. 定义Block中需要执行的操作

下面通过一个实际的例子来实践一下Block的回调实现方法。

  • 创建一个Single View Application类型的工程。

  • 定义带Block参数的方法。创建一个Task类,继承自NSObject。在Task.h文件中,添加如下的方法,在该方法中,设置一个Block作为参数。其中,(void(^)(void))表示为一个没有参数和返回值的Block。

#import <Foundation/Foundation.h>
@interface Task : NSObject
-(void) beginTaskWithCallbackBlock:(void (^)(void)) callbackBlock;
@end
  • 设置Block的回调时机。在Task.m文件中,实现该方法。下面的代码中,当方法被调用时,会打印一行Log,提示任务开始。3秒钟后,会调用Block中的代码。
-(void)beginTaskWithCallbackBlock:(void (^)(void))callbackBlock{
    NSLog(@"任务开始,3秒后调用block中的代码! 现在时间是:%@",[NSDate date]);
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        callbackBlock();
    });
}
  • 定义Block中需要执行的操作。在上面代码的实现过程中,最关键的是定义了Block的调用时机,但没有定义Block的代码内容。Block中的代码内容,可以在使用该方法时进行赋值。在工程的ViewController.m文件中,导入Task.h头文件,并添加下面的代码,当执行到Block时,打印一行日志,提示任务完成。
- (void)viewDidLoad {
    [super viewDidLoad];
    Task *task = [[Task alloc] init];
    [task beginTaskWithCallbackBlock:^{
        NSLog(@"block中的代码被执行!现在时间是:%@",[NSDate date]);
    }];
}

运行结果如下,通过两行日志执行的位置以及执行的时间,可以验证Block回调的使用方法。

示例代码

https://github.com/99ios/5.1.4