IOS Protocol与Delegate详解(二)

原创 2015年07月09日 18:04:27

 上一篇的地址为:  IOS Protocol与Delegate详解(一)

上一篇讲了协议的最基本用法,这一次讲协议更重要的地方:回调协议


回调协议(委托)


 在我的理解中,所谓的委托,其实就是回调协议的意思,也就是说委托就是一个非常强大的依靠协议的设计模式,所以有人说,在OC中,委托是协议的一部分

 为什么说委托是及其重要的概念呢,例如在网络请求的时候,我们得主UI线程不知道分线程什么时候从网络上面请求回完整的数据,而且也有可能失败,这样做最简单得方法就是,自定义一个委托协议,并让主UI线程的类实现此委托,将自己这个委托对象传递给网络请求的类,这样,不管网络请求成功或失败,网络请求类都可以回调相应的委托来解决

  不仅仅是网络请求,当多线程操作,数据库操作,类间通信都极有可能用到这种设计模式

  

  下面举一个生活中的例子来解释一个委托


  比如说有一个领导,旁边有他得秘书小李,有一天,领导给小李说:"小李啊,没茶叶了,你给我弄点上好茶叶去,如果弄回来了,我就给你涨工资如果没弄上,就去站墙根去。"

  

  上面的例子可以这么解释,领导与小李之间有一个"弄茶叶"协议,"弄茶叶"协议中有两个方法(也可以理解为事件),一个是"弄回来了"方法,一个是"没弄回来"方法,而领导就是这个这两个方法的制定者,但是小李却是这两个方法的执行者,听懂了吗?

    

   其实最简单得理解就是先把方法都抽象出来,然后将其组成一个协议,弄清谁是这个协议的制定者,上述中,领导说的这句话,制定了规矩(协议),其实就是实现了协议,但是谁执行呢,总不能领导站墙根吧偷笑,所以执行者是小李。


   抽象完毕,其实就是领导和小李之间有一个"弄茶叶"协议,领导实现了此协议,小李去弄茶叶,然后根据情况回调不同得协议方法,所以,领导是小李的委托对象


  说了这么多,可能有些人已经懵了,所以,通过例子来解答


 下面是得到茶的协议:

  

#import <Foundation/Foundation.h>

@protocol GetTeaDelegate <NSObject>



@required
/**
 
 成功得到茶的方法
 
 */
-(void) getTeaSuccess;


/**
 
 没有得到茶的方法
 
 */
-(void) getTeaFail;



@end

 领导类的.h文件:


#import <Foundation/Foundation.h>

#import "GetTeaDelegate.h"

@interface Leader : NSObject<GetTeaDelegate>{
    
}

@end

 领导类的.m文件

#import "Leader.h"


@implementation Leader


/*
 
 现在是以领导的角度来实现这个协议
 
 规定小李在不同的情况下该干什么
 
 */


/**
 
 成功的得到茶
 
 */
-(void) getTeaSuccess{
    
    NSLog(@"不错不错,这月给你涨工资");
    
    
}



/**
 
 没拿到茶
 
 */
-(void) getTeaFail{
    
    NSLog(@"站墙角去!");
    
    
}


@end


 下面是职员类的.h文件

#import <Foundation/Foundation.h>

#import "GetTeaDelegate.h"

@interface Worker : NSObject{
    
   
    
}

//小李的得到茶的代理
@property (nonatomic) id<GetTeaDelegate> myGetTeaDelegate;

/**
 
 需要传入一个实现了得到茶这个协议的对象来做自己的代理,方便完成或失败后回调
 
 */
-(Worker *) initWithDelegate:(id<GetTeaDelegate>) delegate;

/*
 
 模拟去得到茶的方法
 
 */
-(void) goToGetTea;

@end

 职工类的.m文件

#import "Worker.h"

@implementation Worker

/**
 
 需要传入一个实现了得到茶这个协议的对象来做自己的代理,方便完成或失败后回调
 
 */
-(Worker *) initWithDelegate:(id<GetTeaDelegate>) delegate{
    
    self=[super init];
    
    if (self) {
        
        self.myGetTeaDelegate = delegate;
        
        
    }
    
    return self;
    
}

/*
 
 模拟去得到茶的方法
 
 */
-(void) goToGetTea{
    
    NSLog(@"弄茶中...");
    
    //声明一个定时器,让其5秒钟之后执行successToGetTea(假设成功得到了茶),来模拟得到茶的过程
    NSTimer *timer=[NSTimer scheduledTimerWithTimeInterval:5.0f target:self selector:@selector(successToGetTea) userInfo:nil repeats:NO];
    
}


/*
  模拟得到茶成功的方法
 */
-(void)successToGetTea{
    
    //判断代理是否为空
    if (self.myGetTeaDelegate) {
        
        
        //回调代理的方法
        [self.myGetTeaDelegate getTeaSuccess];
        
        
    }
    
}

/*
 模拟得到茶失败的方法
 */
-(void) failToGetTea{
    
    //判断代理是否为空
    if (self.myGetTeaDelegate) {
        
        
        //回调代理的方法
        [self.myGetTeaDelegate getTeaFail];
        
        
    }
    
    
}



@end


 最后,在主函数下写上如下方法

    
    //初始化一个领导对象
    Leader * leader = [[Leader alloc] init];
    
    //初始化一个职工类对象,将代理传进去
    Worker *xiaoli = [[Worker alloc] initWithDelegate:leader];
    
    //模拟去得到茶
    [xiaoli goToGetTea];

刚开始的运行结果为


弄茶中...



5秒钟后,运行结果为


弄茶中...

不错不错,这月给你涨工资



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

IOS Protocol与Delegate详解(一)

我所认为的Protocol(协议)是类似于java中的接口这一概念的,所谓协议,可以理解成一个类所具有的方法的特征集合,协议也属于面向对象的一部分,使用它,可以弥补类的不能多继承缺点,继承和协议的双重...

第二章、Objective-c 语法,继承,protocol和delegate(iOS学习笔记,从零开始)

OC是面向对象编程语言。 @interface ViewController :UIViewController 上面一行代码展现继承语法, Objective-C只支持单继承,但可以...

IOS delegate与protocol

在IOS开发中协议和委托是两个密不可分的概念(也可以说是不同的设计模式,只不过在这里我们把他们讲在一起,因为我们常常都是这么用的):确 切来说,协议[protocol]定义了一种规范,使遵循它的类具备...

iOS开发之OC篇(13)—— Protocol(协议)、Delegate(代理)

协议不是代理;代理不是协议。 协议是多个类(或者说对象)之间协商的一个公共接口,提供一系列方法的声明给类们使用;而代理是协议的一个典型应用机制。

[iOS]delegate和protocol

转自: http://haoxiang.org/2011/08/ios-delegate-and-protocol/ iOS开发上对delegate使用广泛。 记在这里,如果有新人Go...

ios之protocol和delegate——下拉菜单实例

DropDown是下拉菜单的实现,其中某一方法M,在不同情景下的实现不一样,它的具体实现要交给该控件的使用者A实现。 Delegate是两个类之间通信的一种实现方法。

ios之protocol和delegate——下拉菜单实例

DropDown是下拉菜单的实现,其中某一方法M,在不同情景下的实现不一样,它的具体实现要交给该控件的使用者A实现。 Delegate是两个类之间通信的一种实现方法。

[iOS]delegate和protocol

[iOS]delegate和protocol Posted on 2011/08/26 今天上班和同事讨论工程怎么组织的时候涉及到这个话题。 iOS开发上对delegate使用广泛。...

iOS开发-Protocol协议及委托代理(Delegate)传值

前言:因为Object-C是不支持多继承的,所以很多时候都是用Protocol(协议)来代替。Protocol(协议)只能定义公用的一套接口,但不能提供具体的实现方法。也就是说,它只告诉你要做什么,但...

iOS开发-Protocol协议及委托代理(Delegate)传值

前言:因为Object-C是不支持多继承的,所以很多时候都是用Protocol(协议)来代替。Protocol(协议)只能定义公用的一套接口,但不能提供具体的实现方法。也就是说,它只告诉你要做什么,但...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)