美文网首页iOS
Block常用整理

Block常用整理

作者: 亲爱的大倩倩 | 来源:发表于2019-05-16 15:14 被阅读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;
}

相关文章

  • Block常用整理

    善用block,可以进行很好的封装,但总是容易混,所以整理一下~ 独立block格式: typedef 返回值类型...

  • Block相关备忘

    block定义 typedef常用block 常用

  • 初步多线程(GCD)_1

    1. 常用方法: (1)block定义: -- block语法 a) 声明: ...

  • NSNotification、Block、Delegate和KV

    iOS开发中数据传递的方法有很多种,我这里整理一下常用的NSNotification、Block、Delegate...

  • iOS-Block 浅谈

    前言:Block 是开发过程中常用便捷的回调方式,本文简单介绍 Block 一、Block 简介 Block 对象...

  • Block整理

    Block 概念 闭包 = 一个函数「或指向函数的指针」+ 该函数执行的外部的上下文变量「也就是自由变量」;Blo...

  • 整理Block

    用了Block那么久,一直以来没有好好整理,只知道如何使用,对有些概念也不是了解特别清楚,感觉似懂非懂的。借助网上...

  • Block整理

    Block block其实就是一个代码块,把你想要执行的代码封装在这个代码块里,等到需要的时候再去调用。那bloc...

  • iOS 常用数据(不定时提交更新)

    iOS 常用数据 别名 ——Block 枚举

  • display:block,inline,inline-bloc

    display几个常用的属性以及区别 none,block,inline,inline-block; none:会...

网友评论

    本文标题:Block常用整理

    本文链接:https://www.haomeiwen.com/subject/mwlraqtx.html