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