zoukankan      html  css  js  c++  java
  • OC3大回调模式使用总结(三)block回调

    OC 3大回调模式使用总结(三)block回调


    block 又称 代码块,闭包等

    是一个匿名的函数,它能够当做一个对象来使用,仅仅只是这个对象非常特殊,是一段代码,他能够保存你写的一段预备性质代码,待某个不确定的事件发生时再调用;事件发生时,它可能会给你传递一些状态參数(回传),来方便你的使用


    block经常使用类型(能够看做一个匿名函数的类型):

    typedef int(^Add)(int,int);//定义一个block类型
    typedef void(^Logg)(NSString *);//有一个參数,可是没有返回值的
    typedef void(^FFF)(void);//没有參数也没有返回值
    

    block外部变量(能够被block引用)

       NSString *s1 = @"你好外部变量1";
         __block   int ccc = 2;//__block修饰的变量能够在代码块内部改变,否则是不能够改变的

    使用上述的3中block类型,定义3个block变量,能够当做函数使用

          Add aa = ^(int a,int b)//定义一个block变量,变量的值是一段代码
            {
                
                NSLog(@"s1 = %@",s1);//捕获外部变量
                NSLog(@"ccc = %d",ccc);
                ccc++;//默认外部变量是仅仅读的,除非加上__block
                return a+b;
            };
            
            NSLog(@"%d",aa(1,2));//调用aa 代码块
            

    Logg lo = ^(NSString *str)
            {
                NSLog(@"打印字符串!%@",str);
            };
            
            lo(@"没有返回值的block測试!");
    

    FFF f = ^(){NSLog(@"s1 = %@",s1);ccc++;};
            f();//没有參数的block使用





    block的使用场景:

    1.网络请求的回调
    2.封装自己定义的组件
    3.反向传值
    4.其它
    

    block的特点:block中能够捕获其它对象的属性和方法,作用域非常大;我们在(3)中进行说明

    (1)假设你使用过AFNetworking或者ASIHttpRequest你不会对第1种使用场景产生不论什么疑问,对于网络请求的成功或者失败的操作,都是须要时间的,都是异步的操作;所以,你须要提前写好操作代码,待某个状态到达的时候会则自己主动调用这段代码;比如你提前写好网络请求成功之后的block块,该block可能包括一些參数,这些參数是请求成功或者失败之后的參数,能够让你对这些參数进行处理

    比如AFNetworking的使用,对于成功或者失败之后的处理都是使用了block

    成功之后的运行的block  

     success:^(AFHTTPRequestOperation *operation, id responseObject) {}

    失败之后运行的block

     failure:^(AFHTTPRequestOperation *operation, NSError *error) {//失败之后的block块 }

    /*

     * 开启一个异步网络请求,成功或失败后,会运行你写的代码

     */  

    AFHTTPRequestOperation *op = [self.afMannager GET:url parameters:dict success:^(AFHTTPRequestOperation *operation, id responseObject) {//成功后其返回成功的状态參数,供你使用
            NSArray *arr = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil];//JSON解析
            } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
      //失败之后的block块,处理失败操作
        }];
        op.responseSerializer = [AFHTTPResponseSerializer serializer];
        [op start];//開始请求
    

    (2)你也能够自己封装一些组件,然后给外界一些处理事件的接口,这个时候你也能够使用block回调模式;仅仅须要外界传入他的处理代码,那么这个组件在达到这个状态的时候,就会自己主动调用你写的代码.


    (3)反向传值,比如两个界面A,B;点击A界面上的button跳到B 编辑界面,B编辑界面在返回时须要传给A界面一些字符串,这个过程是反向传值;这个时候我们能够使用block模式来实现.

    在A类中,我们能够预设B界面返回时的代码,即使用block,注意到在B返回时,这个事件须要汇报B自身的状态,即B要汇报一些实用的參数(字符串),那么block须要有一个參数,该參数就是B返回时传来的

    代码演示样例:

    A中给B预设返回时的代码块,也就是说B 的代码块获得了A的属性和方法,B在状态改变时会调用该block改变A
       A.m
        [B setTapSaveBlock:^(NSString *str) {
                      [self.btn_Hobby setTitle:str forState:UIControlStateNormal];
                }];
    [self.navigationController pushViewController:B animated:YES];//从A 推到B 界面
    

    描写叙述: A推到B界面之前,首先给B设置返回时的代码,该代码用于返回B的參数str,该代码用于调用A的某些属性或者方法

    效果:在B的block控制了A的某些属性和方法,且B能汇报自己的状态给A(也就是block的參数);A的属性拿到B的參数后可能将该參数用于配置A,从而达到了反向传值的目的,把B的值传给了A

    效果演示:

    A界面:


    点击我的昵称,签名,兴趣爱好会推到一个新的界面B:


    B 界面:



    在B编辑完毕,之后须要把最新的文本,回传给A; 也就是关闭 B界面时,A上须要显示B传给A的 字符串,这个过程就包括由B到A的反向传值过程

    很多其它相关文章:http://blog.csdn.net/yangbingbinga/article/category/2437601



















  • 相关阅读:
    【带着canvas去流浪(14)】Three.js中凹浮雕模型的生成方式
    Stanford公开课《编译原理》学习笔记(1~4课)
    Vue源码中compiler部分逻辑梳理(内有彩蛋)
    Vue+ElementUI项目使用webpack输出MPA
    Vue-Router中History模式
    Vue中拆分视图层代码的5点建议
    如何正确使用Java泛型
    ZooKeeper的三种典型应用场景
    Tomcat多实例部署
    Tomcat常用的过滤器
  • 原文地址:https://www.cnblogs.com/lxjshuju/p/6962439.html
Copyright © 2011-2022 走看看