创建block对象
block 对象可以是内嵌的,也可以是独立的代码块的形式。
我们先来看下传统的OC函数是怎么写的,假设一个OC函数要接收两个NSInteger并返回他们的差值,我们这样写:
- (NSInteger) subtract:(NSInteger)paramValue
from:(NSInteger)paramFrom{
return paramFrom - paramValue;
}
接下来我们用纯C函数的来实现:
NSInteger subtract(NSInteger paramValue, NSInteger paramFrom){
return paramFrom - paramValue;
}
再来看看用block怎么来实现:
NSInteger (^subtract)(NSInteger, NSInteger) =^(NSInteger paramValue, NSInteger paramFrom){
return paramFrom - paramValue;
};
先再来多看看例子,假设一个函数要接收一个NSUInteger参数,并用字符串的形式返回,用C我们是这么写的:
NSString* intToString (NSUInteger paramInteger){
return [NSString stringWithFormat:@"%lu",(unsigned long)paramInteger];
}
用Block我们是这么写的:
NSString* (^intToString)(NSUInteger) = ^(NSUInteger paramInteger){
NSString *result = [NSString stringWithFormat:@"%lu",(unsigned long)paramInteger];
return result;
};
最简单的独立的block对象当然是不接收参数返回void的形式:
void (^simpleBlock)(void) = ^{
/* Implement the block object here */
};
block对象可以像C函数一样被调用。像C函数一样传递参数或获得返回值。来个例子:
NSString* (^intToString)(NSUInteger) = ^(NSUInteger paramInteger){
NSString *result = [NSString stringWithFormat:@"%lu",
(unsigned long)paramInteger];
return result;
};
- (void) callIntToString{
NSString *string = intToString(10);
NSLog(@"string = %@", string);
}
callIntToString 函数调用了intToString block对象,并把10传给他,然后用一个局部变量接收返回值。
好了,block对象你已经知道怎么写了是不是,接下来,我们来看下怎么把它当做一个参数传给函数。假设我们需要一个函数来接收一个整形和一个block对象,在函数内用block对象对这个整形进行处理并返回处理结果:
- (NSString *) convertIntToString:(NSUInteger)paramInteger usingBlockObject:(IntToStringConverter)paramBlockObject{
return paramBlockObject(paramInteger);
}
可是编译器怎么知道你这个block可以接收整形参数呢?这时你可在在函数前面先做声明:
typedef NSString* (^IntToStringConverter)(NSUInteger paramInteger);
这样我们就可以这样来调用了:
- (void) doTheConversion{
NSString *result = [self convertIntToString:123 usingBlockObject:intToString];
NSLog(@"result = %@", result);
}
block对象也可以直接在函数内实现:
- (void) doTheConversion{
IntToStringConverter inlineConverter = ^(NSUInteger paramInteger){
NSString *result = [NSString stringWithFormat:@"%lu",
(unsigned long)paramInteger];
return result;
};
NSString *result = [self convertIntToString:123
usingBlockObject:inlineConverter];
NSLog(@"result = %@", result);
}
甚至在需要传递时才去实现:
- (void) doTheConversion{
NSString *result =
[self convertIntToString:123
usingBlockObject:^NSString *(NSUInteger paramInteger) {
NSString *result = [NSString stringWithFormat:@"%lu",
(unsigned long)paramInteger];
return result;
}];
NSLog(@"result = %@", result);
}
这是我们创建的就是内联的block 兑现(inline block object)