//block声明:返回值(^block变量名)(参数)
void(^block)();
//block定义:三种方式 = ^(参数){};
//第一种
void(^block1)(void) = ^{
NSLog(@"调用了block1");
};
//第二种:block 如果没有参数,参数可以隐藏,如果有参数,定义的时候,必须写参数,而且必须要有参数变量名
void(^block2)(int) =^(int a){
};
//第三种 block返回值可以省略,不管有没有返回值,都可以省略
int(^block3)(void) = ^{
return 3;
};
//同上
int(^block4)(void) = ^int{
return 3;
};
//block 类型:int(^)(NSString *) 返回值省略了
int(^block5)(NSString *) = ^(NSString *name){
return 4;
};
//block 调用
block1();
block2(3);
block3();
block4();
block5(@"haha");
//场景1:在一个方法中定义,在另一个方法中调用 test调用
//BlockType 类型别名
typedef void(^BlockType)(void);
/**1,建立一个block 属性 练习 功能是传入一个String 输出一个String */
@property (nonatomic,strong)NSString *(^block1)(NSString *);
//定义一个block
NSString *(^block)(NSString *)=^NSString *(NSString *a){
NSString *str = [NSString stringWithFormat:@"打印++%@",a];
NSLog(@"%@",str);
return str;
};
//赋值保存为全局属性
_block1 = block;
//调用block 对应第一个开发场景
- (IBAction)test:(id)sender {
_block1(@"abc");
}
//场景2:在一个类中定义block,在另一个类中调用
1.创建一个模型
#import <Foundation/Foundation.h>
//BlockType 类型别名
typedef void(^BlockType)(void);
NS_ASSUME_NONNULL_BEGIN
@interface CallItem : NSObject
/** name */
@property (nonatomic,strong) NSString *name;
/** 动作 */
@property (nonatomic,strong) void(^block)(void);
//一样的定义block 同上
@property (nonatomic,strong) BlockType block2;
@property (nonatomic,strong) NSString *(^block3)(NSString *);
+ (instancetype)callItemWithString:(NSString *)name;
@end
NS_ASSUME_NONNULL_END
----------------------------------------
#import "CallItem.h"
@implementation CallItem
+ (instancetype)callItemWithString:(NSString *)name{
CallItem *item = [[CallItem alloc]init];
item.name = name;
return item;
}
@end
//创建模型并且在block 中写入内容 并加入数组中
CallItem *item1 = [CallItem callItemWithString:@"111"];
item1.block = ^{
NSLog(@"tap1");
};
item1.block3 = ^NSString * _Nonnull(NSString * a) {
NSLog(@"打印%@",a);
return a;
};
CallItem *item2 = [CallItem callItemWithString:@"222"];
item2.block = ^{
NSLog(@"tap2");
};
CallItem *item3 = [CallItem callItemWithString:@"333"];
item3.block = ^{
NSLog(@"tap3");
};
[self.callItems addObject:item1];
[self.callItems addObject:item2];
[self.callItems addObject:item3];
//点击调用
- (IBAction)tap1:(UIButton *)sender {
CallItem *item = self.callItems[0];
item.block();
item.block3(@"tap1");
}
- (IBAction)tap2:(UIButton *)sender {
CallItem *item = self.callItems[1];
item.block();
}
- (IBAction)tap3:(UIButton *)sender {
CallItem *item = self.callItems[2];
item.block();
}
//定义一个使用block返回参数的方法
- (void)post:(id)url params:(id)paramsDic model:(ResModel *)model finishCallbackBlock:(void (^)(NSString *, ResModel *))block{
[self request:url Params:paramsDic model:model FinishCallbackBlock:^(NSString *error, ResModel *result) {
block(error,result);
} type:0];
}
/// 我的粉丝请求接口
/// @param currentPage 当前页
/// @param successBlock 成功回调
/// @param fail 失败回调
- (void)userFansQuery:(NSInteger)currentPage withSuccess:(void (^)(NSArray *_Nonnull fansList , CatPaginator *paginator))successBlock withFail:(nullable void(^)(void))fail;
最基本 使用:
//函数Block 回调
complete:(void(^)(void))complete;
typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。
//type
typedef void(^xxBlock)(void);
@property (copy, nonatomic) void (^actionBlock)(void);