iOS

Block常用整理

2019-05-16  本文已影响8人  亲爱的大倩倩

善用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方法,我们均是在回调中去进行网络请求


image.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
image.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
image.png
image.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;
}

上一篇 下一篇

猜你喜欢

热点阅读