美文网首页
小白理解iOS代理模式

小白理解iOS代理模式

作者: Dust52100 | 来源:发表于2019-06-13 23:08 被阅读0次

    1.情景理解代理模式:

    之前老王借给李赖皮2000块钱,可是一直没有拿回这个钱,老王想通过法律途径把这笔钱要回来,可是自己没有这个能力或者是自己不愿意直接面对李赖皮,就打算找一个代理律师帮自己要回这笔钱,整个过程也就是老王通过律师要回钱。
    老王: 委托方
    律师: 代理方

    前期准备工作一(老王写协议的准备工作)

    老王想找个律师给自己干活,并且还得告诉律师自己需要律师做什么事情以及怎么去做,那就得签一个帮他要钱的协议(GetMoneyDelegate):协议如下(写在Person.h):

    //  Person.h
    #import <Foundation/Foundation.h>
    
    //定义协议和方法
    @protocol GetMoneyDelegate <NSObject>
    -(void)getMoney:(NSString *)name value:(NSString *)money;
    
    @end
    
    @interface Person : NSObject
    //声明委托变量
    @property(nonatomic,retain) id<GetMoneyDelegate> person_delegate;
    
    -(void)wantMoneyBack;
    
    @end
    

    向谁要钱?又要多少钱呢?这个是老王需要告诉律师的,所以协议里面写了一个要钱的方法,并且这个方法带了参数:欠债人名字和金额:

    -(void)getMoney:(NSString *)name value:(NSString *)money;
    

    另外协议里面还有一个person_delegate,这是老王在协议里声明的一个代理,找的代理律师回头赋值到这个代理,代理律师就可以做事了。

    通过这样一个协议,老王回头在自己的.m文件中wantMoneyBack的时候告诉自己的代理去执行要钱的方法,并且告诉向谁要钱,要多少钱就行了,至于代理怎么去做就不管自己的事了,老王就可以睡大觉等着了。这一切放在Person.m中:

    //  Person.m
    #import "Person.h"
    
    @implementation Person
    
    -(void)wantMoneyBack{
        NSLog(@"我想要回我的钱");
        [self.person_delegate getMoney:@"李赖皮" value:@"2000"];
    }
    
    @end
    

    前期准备工作二(律师的准备工作)

    首先,律师想去为老王要钱,那么就必须遵守老王的协议,这样律师才知道应该向谁要钱并且要多少钱,所以律师在自己的Lawyer.h中遵守老王的协议:

    //  Lawyer.h
    #import <Foundation/Foundation.h>
    #import "Person.h"
    
    @interface Lawyer : NSObject<GetMoneyDelegate>
    
    @end
    

    并且在自己的Lawyer.m中实现协议中的要钱方法:

    //  Lawyer.m
    #import "Lawyer.h"
    
    @implementation Lawyer
    
    -(void)getMoney:(NSString *)name value:(NSString *)money{
    //下面就是代理需要帮委托方做的事情,做什么事情怎么做等参数是委托方传递的
        NSLog(@"本律师帮你向%@要回了%@元钱",name,money);
    }
    
    @end
    

    然后接下来就是真正的律师干活的阶段了

    干活阶段

    在ViewController.m中:

    //  ViewController.m
    #import "ViewController.h"
    #import "Person.h"
    #import "Lawyer.h"
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    - (void)viewDidLoad {
        
        Person *laowang = [Person new];
        Lawyer *lawyer = [Lawyer new];
        //老王找到律师给自己做代理
        laowang.person_delegate = lawyer;
        //只有老王的代理也就是律师实现了要钱的方法,老王这个委托方才有底气说要钱
        if ([lawyer respondsToSelector:@selector(getMoney:value:)]) {
            [laowang wantMoneyBack];
        }
       
    }
    
    @end
    

    执行结果如下:


    控制台打印结果

    所以这整个过程我们就可以看到,老王这个对象仅仅调用了自己的wantMoneyBack方法,方法体里是让自己的代理为自己做事,并且把参数设置好,并没有自己亲自去要钱,就达到了要钱的目的。

    -(void)wantMoneyBack{
       NSLog(@"我想要回我的钱");
       [self.person_delegate getMoney:@"李赖皮" value:@"2000"];
    }
    

    2.代理模式在iOS中的应用

    代理在iOS中有一个重要的应用就是反向传值,比如有两个控制器AViewController和BViewController,点击A的跳转按钮就能跳到B控制器,在B控制器的textField上输入字符串并且点击返回,回到A控制器后,字符串显示在A控制器的视图上。显然,B控制器是没有能力在A控制器上显示自己内部的字符串的,但是我们可以通过代理的方式来实现。
    可以参考这篇文章:
    https://www.cnblogs.com/jukaiit/p/5021730.html

    相关文章

      网友评论

          本文标题:小白理解iOS代理模式

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