代理与回调的异同

来源:互联网 发布:mac内存清理 编辑:程序博客网 时间:2024/05/22 00:24


代理与回调
2、代理与回调


1)整体思路:
    代理回调与代理传值是不同的,代理传值只有主动方和被动方,只有单向没有双向交流,
而代理回调是需要主动方和被动方进行互动,主动方同时也是最终数据的接受方。
代理传值的代理是被动方,即主动方让代理去干某件事。回调的代理是主动方,被动方做好后,
需要执行主动方代理的方法,将信息传递给主动方去处理。
    当然,回调与传值的不同还在于,如人下载数据,人是主动方,电脑是被动方,电脑下载数据
后,这个数据可以给人去手工分析,也可以让服务器去分析。所以,代理就不是被动方。而是将被动方
处理后,交给其他对象,而不仅仅是交给主动方。此外,人让电脑下载,电脑必须在人这个类里面被实例化,
而不能像上面可以在主函数被实例化。因为这里被动方电脑不是代理了,无法在类外将电脑实例化赋给类里面。
2)代理定义:这里关注于被动方处理后的数据,需要交由代理方去处理。如人让电脑下载资料,人是主动方,
电脑是被动方,但是代理是谁呢?代理负责将被动方获得的数据进行处理,代理可以是人也可以是服务器或者
是外星人。如果只有主动方和被动方,那么只能由主动方当代理处理被动方获得的数据。
···代理代码定义:
@protocol MCJDownloadDelegate
// 规定接受数据的接口,负责处理数据
- (void)messageWithDownload:(NSString *)message;
@end


3)主动方(只是暂且当做代理,如果定义新的对象如服务器当做代理,那么人仅仅是主动方,而不能作为代理)
·1·主动方头文件(此情况下也是代理)遵循代理协议
@interface MCJPerson : NSObject
// 属性存储下载到的数据
@property (nonatomic,copy)NSString *message;
// 开始下载,即主动方的功能
- (void)personGetMessageWithPath:(NSString *)path;
@end
这里没有声明代理的方法,是因为遵循代理协议的类可以只在实现中定义,不需要在头文件中。


·2·主动方的实现
@implementation MCJPerson
- (void)personGetMessageWithPath:(NSString *)path
{
    // 建立代理关系
    MCJDownload *download = [[MCJDownload alloc] init];
    download.delegate = self;
    [download downloadWithpath:path];
}
- (void)messageWithDownload:(NSString *)message
{
    self.message = message;
    NSLog(@"人类正在处理这个数据");
}
@end


可以看到主动方需要某个东西,需要被动方去做,但是这里把被动方当做主动方的代理,虽然是代理但是不用
代理协议,而是在主动方的类中将被动方进行实例化。但是被动方的代理是主动方,这是被动方处理完数据后,
需要把数据传递给代理方进行后期进一步处理。
 
 4)被动方
·1·代理协议是定义在被动方的头文件中,其实代理协议也可以不定义在被动方中,可以直接创建一个头文件,
定义代理协议。
·2·被动方头文件:
@interface MCJDownload : NSObject
@property (nonatomic,weak)iddelegate;


// 下载方法
- (void)downloadWithpath:(NSString *)path;
@end


被动方的头文件定义了代理属性,这是为了调用代理处理数据方法。还定义了被动方下载数据的方法。


·3·被动方实现方法:
@implementation MCJDownload


- (void)downloadWithpath:(NSString *)path
{
    printf("正在努力下载中。。。。\n");
    printf("正在努力下载中。。。。\n");
    printf("正在努力下载中。。。。\n");
    printf("正在努力下载中。。。。\n");
   
    sleep(2);
   
    NSString *str = [NSString stringWithFormat:@"我是从%@,下载下来的泷泽萝拉影片",path];


    // delegete指向接受方
    [self.delegate messageWithDownload:str];
}
@end


5)总结
    这里的主动方和被动方互为代理,但是使用代理协议的是主动方,即主动方是代理。实质上二者互为代理。
主动方人下载资料,被动方电脑去下载,此时可以将被动方当做主动方的代理,但是实质上未定义,而是采取在
主动方的类中将被动方实例化调用被动方的函数。
    被动方电脑下载数据后,调用代理的函数去处理数据,这里把主动方人当做被动方电脑的代理,而其他情形中
被动方电脑的代理不一定是主动方人,也可能是其他类如服务器

0 0
原创粉丝点击