zoukankan      html  css  js  c++  java
  • ios

    • block在代理,kvo中传递数据效率最高

    实现原理

    控制器B想传递数据给控制器A.通过在B控制器中创建Block类型的类,创建方法,方法参数是刚才创建的block类型的变量.在方法实现的内部调用参数的block(@"你好");此时调用到了block则,block就会到写了blcok实现的地方去执行代码,也就是A控制器中,在A控制器中调用B控制器刚才创建的方法,由于方法的参数有block,则定义block内部要实现的代码,定以后,当A掉用B内部的方法,然后方法跳入B控制器去执行,当方法内部的block比调用的时候,由于实现在A控制器,则又会跳回来A控制器执行A中定义的block要实现的代码.具体看下面例子

    //
    //  SecondViewController.h
    //  test
    //
    //  Created by 裴波波 on 16/4/8.
    //  Copyright © 2016年 裴波波. All rights reserved.
    //
    
    #import <UIKit/UIKit.h>
    
    //先定义一个有参数,参数类型为NSString * 类型,无返回值的block类型
    typedef void(^Myblock)(NSString *);
    @interface SecondViewController : UIViewController
    
    @property(nonatomic,copy) Myblock frstBlock;
    
    //定义方法参数是block
    -(void)testANewBlock:(Myblock) block;
    
    @end
    
    
    • .m文件实现
    
    //
    //  SecondViewController.m
    //  test
    //
    //  Created by 裴波波 on 16/4/8.
    //  Copyright © 2016年 裴波波. All rights reserved.
    //
    
    #import "SecondViewController.h"
    
    @interface SecondViewController ()
    
    @property (weak, nonatomic) IBOutlet UILabel *lblName;
    @end
    
    @implementation SecondViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view.
    }
    
    -(void)testANewBlock:(Myblock)block{
    
        //调用block,此时block的实现代码在哪里写的就会在哪里执行.此时blcok实现在ViewControlle中写的,执行时跳入A控制器,把参数@"裴波波" 传入到Viewcontroller控制器
        block(@"裴波波");
    }
    
    
    @end
    
    
    
    • viewcontroller控制器代码
    
    //
    //  ViewController.m
    //  test
    //
    //  Created by 裴波波 on 16/4/8.
    //  Copyright © 2016年 裴波波. All rights reserved.
    //
    
    #import "ViewController.h"
    #import "SecondViewController.h"
    
    @interface ViewController ()
    @property (weak, nonatomic) IBOutlet UIButton *btn;
    
    @end
    
    @implementation ViewController
    
    
    -(void)viewDidLoad{
    
        [super viewDidLoad];
    }
    
    //点击按钮跳转控制器
    - (IBAction)clickButton:(id)sender {
        
        SecondViewController * seVc = [SecondViewController new];
        
        //调用secondVC方法,字定义secondVc中调用block的时候要执行的代码,在secoVc中调用block-----block在哪里就在那个控制器里面执行block,
        [seVc testANewBlock:^(NSString * name) {
            NSLog(@"peibobo---%@",name);
            [_btn setTitle:name forState:UIControlStateNormal];
        }];
    }
    
    
    @end
    
    
    
    

    小结: 谁要穿值谁就定义含有block的参数的方法,在方法内部调用blcok,将要传递的参数给了blcok,blcok跳进实现它要执行代码的'地方'执行代码.传值完成,如果涉及到三层以上的回调建议不要使用,因为这样会乱的.尤其是界面间的跳转,可以选择用通知.

  • 相关阅读:
    重新想象 Windows 8 Store Apps (32) 加密解密: 非对称算法, 数据转换的辅助类
    《C#编程极限》目录
    《软件设计精要与模式》完稿(原名《软件设计之道》)
    《软件设计之道》正式更名为《软件设计精要与模式》
    《软件设计精要与模式》各篇之篇首语
    Visual Studio 2005单元测试中关于外部文件的问题解决
    Web Service Software Factory
    Windows下IIS+PHP 5.2的安装与配置
    规划你的C#程序——《C#编程极限》第一章
    《软件设计精要与模式》前言
  • 原文地址:https://www.cnblogs.com/adampei-bobo/p/5370426.html
Copyright © 2011-2022 走看看