对 block(回调函数) 的一点理解


注:工作中的一点总结


  • 简化block 定义,以便更加方便的使用
    typedef int(^MyBlock)(int, int);

  • block 的简单使用
    1 作为属性使用
    @property (nonatomic,copy)MyBlock block;
    2 我们开发中用到的最多就是传值
    例:假如我们有一个这样需求:A push 到 B 页面,我们需要B页面返回 A 页面时,修改A页面的背景色,或者一些其他的操作。

    实现方法

    我们在 B页面声明一个block,作为参数
    @property (nonatomic, copy) void(^colorBlock)(UIColor *color);
    注:站在 c 语言的角度看block ,其实block 本质就是一个匿名函数,这里使我们有时候经常忽略的一点,导致自己定义的block出问题,这里做一个简单记录。因block 本质是一个函数,当我们定义了它的时候,我们想要监控block内部代码的逻辑,那么我们必须调用函数,这样才能进入到函数的内部。但是我们在用block 的时候又是经常忘记这步,也就是block 调用的步骤
    block 的调用

    if (self.colorBlock) {
          self.colorBlock(color);// 回调函数的调用
    } 
    

    既然有了调用,那么我们就得有block的具体实现了,也就是我们想要做的操作

    我们在 A 页面 实现 block 的具体操作(这里只是修改下背景色)

    // 首先创建 B对象
    B = [[B alloc] init];
    // 调用B 里面的block属性,并实现
    B.colorBlock = ^(UIColor *color){
      // A 页面的背景色设置
    }
    

二 block 作为某个方法的参数 这是我们经常忽略的一点
假如我们写了一个方法:
CreateControllerWithBlock:(colorBlock)block

    b = [[B alloc] init]
    [b CreateControllerWithBlock:^(UIColor *color){
        // block 里面代码的实现操作
    }]

当我们调用这个方法时,我们调用这个方法时,有时会忘记block的工作原理,或者忽略block,从而导致必不能理想办的进入到block函数里面,这点和我们上述提到的其实是同一个问题

注:核心,不管block是作为参数还是属性,要想执行block面的内容,那么必须得有block的对应的调用部分才可以。

假如对block仍有疑惑,或者很感兴趣,可以去看block 的具体实现以及本质,这里只是做了一个简单的记录。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。