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

OC Block块:2-Block的简单使用

定义Block时,可以对Block的输入参数以及返回值的类型进行定义。可以有输入参数,也可以没有输入参数;可以设置一个输入参数,也可以设置多个参数;可以有返回值,也可以没有返回值。

1、无输入参数+无返回值

这种形式的Block,无需任何输入参数,并且无返回值,一般都是在该Block中完成一些动作。例如在UIView类中定义的animateWithDuration:animations:方法,当调用该方法时,在指定的时间(duration参数)内,完成Block((void (^)(void))animations参数)中定义的动画播放。

+ (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations;

我们也可以自定义一个无输入参数、无返回值的Block,如下所示:

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //block定义
        void (^blockWithoutInputAndOutput) (void) = ^(void){
            NSLog(@"欢迎访问 www.99ios.com!");
        };
        //block调用
        blockWithoutInputAndOutput();   
    }
    return 0;
}

运行结果:

2、有输入参数+无返回值

这种形式的Block,有输入参数,但无返回值。一般都是在该Block中根据输入参数完成一些动作,例如,在AFNetworking框架提供的如下方法,需要传入3个Block参数。当获取到网络反馈的数据后,会调用一个Block,该Block没有返回值,但是存在两个参数,其中一个是从服务器获取的数据(responseObject)。

- (nullable NSURLSessionDataTask *)POST:(NSString *)URLString
                             parameters:(nullable id)parameters
                               progress:(nullable void (^)(NSProgress *uploadProgress))uploadProgress
                                success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
                                failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;

我们也可以自定义一个有输入参数、无返回值的Block,如下所示:

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //block的定义
        void (^blockWithInput)(int) = ^(int inputNum) {
            NSLog(@"blockWithInput被调用! 输入参数的值为 %d.",inputNum);
        };
        //block的调用
        blockWithInput(99);
    }
    return 0;
}

执行结果:

3、有输入参数及返回值

Block中可以即有参数也有返回值,此时,需要在Block封装的代码中根据返回值的类型要求提供Block的返回值。例如,下方的示例代码中,blockWithOutputAndInput返回的是参数的平方(inputNum*inputNum)。

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //block的定义
        int (^blockWithOutputAndInput)(int) = ^(int inputNum) {
            NSLog(@"blockWithOutputAndInput被调用!");
            return inputNum*inputNum;
        };
        //block的调用
        int a = blockWithOutputAndInput(100);
        NSLog(@"blockWithOutputAndInput的返回值是:%d",a);     
    }
    return 0;
}
  • 运行结果:

4、有多个输入参数

在Block中可以定义中传入多个参数,多个参数之间使用逗号进行分隔。下面的示例代码中,Block需要传入两个Double类型的参数,这两个参数相乘后的乘积作为返回值。

  • Block的定义与调用
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //block的定义
        double (^multiplyTwoValues)(double, double) = ^(double number1, double number2) {
            return number1 * number2;
        };
        //block的调用
        double doubleNumber = multiplyTwoValues(5.0,5.6);
        NSLog(@"multiplyTwoValues: %f",doubleNumber);
    }
    return 0;
}
  • 运行结果

5、无输入参数+有返回值

最后一种情况是无参数有返回值的Block。如下所示,定义了一个Block,其没有参数,但是会有int型的返回值。

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //block的定义
        int (^blockWithOutput) (void) = ^(void){
            NSLog(@"blockWithOutput被调用!");
            return 100;
        };
        //block的调用
        int a = blockWithOutput();
        NSLog(@"blockWithOutput的返回值:%d", a);
    }
    return 0;
}

运行结果:

示例代码

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