善用block,可以进行很好的封装,但总是容易混,所以整理一下~
独立block
格式: typedef 返回值类型 (^block名称)(参数列表)
1.页面反向传值
A跳转B,在B中做某些操作后网络请求,成功后返回A,A页面更新数据
1.页面2声明block
typedef void(^CCBlock)(NSString *);
@property (nonatomic, copy)CCBlock myCCBlock;
2.在你需要的地方,写好调用方法
if(self.myCCBlock)
{
self.myCCBlock(@"你好");
}
3.在界面1声明界面2的对象,并实现回调
TwoViewController *secondVC = [[TwoViewController alloc] init];
secondVC.myCCBlock = ^(NSString *str)
{
//在此处你可取到str = "你好",可以做刷新界面等其他操作
};
内联block
格式: (返回值 (^)(参数列表))此方法的参数名
常见网络请求回调
/** 在界面2声明内联block并调用*/
- (void)insideBlock: (NSString *)name successBlock:(void (^)(NSString *))success faileBlock:(void (^)(NSString *))fails;
- (void)insideBlock: (NSString *)name successBlock:(void (^)(NSString *))success faileBlock:(void (^)(NSString *))fails
{
//可以在这里做判断,比如有一个BOOL值控制,为True就调用success(name),为False就调用faile(name)
success(name);
faile(name);
}
/** 在界面1声明界面2对象,并实现回调*/
TwoViewController *secondController = [[TwoViewController alloc] init];
[secondController insideBlock:@"name" successBlock:^(NSString *response)
{
//将输入的name直接传了回来
}
faileBlock:^(NSString *response)
{
//将输入的name直接传了回来
}];
稍微复杂点的block
1.下拉刷新
下拉刷新有个block方法,我们均是在回调中去进行网络请求
![](https://img.haomeiwen.com/i1602974/a36b99a19aa0b0c3.png)
######简单思路
# tableView所在的VC,如上图所示调用block方法
[self.tableView addRefreshHeaderWithBlock:^ {
//执行网络请求操作
}];
# UIScrollView的分类,实现上面的block方法,立即回调
-(void)addRefreshHeaderWithBlock:(void (^)(void))Block;
-(void)addRefreshHeaderWithBlock:(void (^)(void))Block{
Block();
}
# 上面的例子是,当VC中tableView调用了addRefreshHeaderWithBlock方法,则立即回调执行网络请求操作
######但实际上并不是立即回调的,而是当监听到headerView的位置变成是下拉后才回调,现在有三个类关联
# tableView所在的VC
[self.tableView addRefreshHeaderWithBlock:^ {
//执行网络请求操作
}];
# UIScrollView的分类,实现上面的block方法,在里面初始化headerView,并将回调block赋值给headerView的block
-(void)addRefreshHeaderWithBlock:(void (^)(void))Block{
FQRefreshHeadView *header = [FQRefreshHeadView new];
[self insertSubview:header atIndex:0];
self.header = header;
header.ReturnBlock = Block;
}
# headerView,声明block,因为是将headerView添加到UIScrollView中,所以在headerView中监听父视图的contentOffset,当监听到下拉时返回
@property (nonatomic, copy) void(^ReturnBlock)(void);
if (self.ReturnBlock){
self.ReturnBlock();
}
# 所以是VC调用了UIScrollView的分类的block方法,分类将block赋值给headerView的block,所以是在headerView调用self.ReturnBlock()时,才会回调VC
2.弹窗block
![](https://img.haomeiwen.com/i1602974/1de30e55067d8037.png)
######我们在外部调用alertView的方法时,看到在某处会有block回调,那么什么时候回调呢
[alertView showWhenCompleted:^(FQAlert *alert, BOOL shouldClose)
{
if(shouldClose)
NSLog(@"YES");
else
NSLog(@"NO");
}]
######现在我们看FQAlert中的实现
//1.声明FQAlertCompletedBlock
typedef void (^FQAlertCompletedBlock)(FQAlert *alertView, BOOL shouldClose);
//2.声明对象
FQAlertCompletedBlock _completeBlock;
//3.当外部调用时可以看到,其实是将外部的block赋值给了_completeBlock,那么我们会知道,只要在FQAlert中任何地方调用了_completeBlock,那么外部就会回调
- (void)showWhenCompleted:(FQAlertCompletedBlock)block
{
_completeBlock = block;
}
//4.点击空白区域时,启动回调
- (void)doCloseAction
{
BOOL shouldClose = YES;
if (_completeBlock)
{
_completeBlock(self, shouldClose);
}
if (shouldClose)
{
[self cancel];
}
}
//5.外部回调
3.数据库block
![](https://img.haomeiwen.com/i1602974/73dae3b23def3bc5.png)
![](https://img.haomeiwen.com/i1602974/56b1b6e3cd1450b1.png)
FQAppSettingDataBase代码
+ (void)ready
{
[[FQDataBase defaultDatabase] createOrUpdateTableNamed:@"app_setting"
updateAction:^BOOL(FMDatabase *db, SInt32 version)
{
BOOL r = [FQDataBase inDatabase:db
creatTableIfNotExit:@"app_setting"
columnArray:
@[@"key",@"value"]];
if (!r)
{
return NO;
}
return r;
}];
}
FQDataBase代码
#pragma mark - 创建表
- (void)createOrUpdateTableNamed:(NSString *)tableName updateAction:(BOOL (^)(FMDatabase *db, SInt32 lastVersion))block
{
[self inTransaction:^(FMDatabase *db, BOOL *shouldRollback)
{
if (block(db, 1))
{
NSLog(@"FQ设置表成功");
}
else
{
NSLog(@"FQ设置表失败");
}
}];
}
- (void)inTransaction:(void (^)(FMDatabase *db, BOOL *shouldRollback))block
{
BOOL shouldRollback = NO;
block(_db, &shouldRollback);
}
/** 表不存在则创建(存在时不检查列是否相同) */
+ (BOOL)inDatabase:(FMDatabase *)db creatTableIfNotExit:(NSString *)table columnArray:(NSArray *)colArray
{
NSMutableString *columnStr = [NSMutableString string];
BOOL first = YES;
for (NSString *col in colArray)
{
if (first)
{
first = NO;
} else
{
[columnStr appendString:@","];
}
[columnStr appendString:col];
}
NSString *sql = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS `%@`(%@)", table, columnStr];
BOOL r = [db executeUpdate:sql];
if (!r)
{
NSLog(@"db create table fail:[errCode:]%d [Msg:]%@", [db lastErrorCode], [db lastErrorMessage]);
}
return r;
}
网友评论