第23条:通过委托与数据源协议进行对象间通信

对象之间需要相互通信,一种名叫“委托模式”的编程设计模式来实现对象之间的通信。

该模式主旨是:定义一套接口,某对象若想接受另一个对象的委托,则需要遵从此接口,以便成为其“委托对象”(delegate)。而这“另一个对象”则可以给其委托对象回传一些信息,也可以在发生相关事件时通知委托对象。

该模式可以将数据与业务逻辑解耦。比如一个显示一系列数据所用的视图,这个视图对象的属性中,可以包含负责数据与事件处理的对象,这两种对象分别称为“数据源”(data source)与“委托”(delegate)。

实现委托对象:声明某个类遵从委托协议,然后把协议中想实现的方法在类中实现出来。某个类若遵从委托协议,可以在接口中声明,也可以在class-continuation分类中声明,一般都是在class-continuation分类里声明。

当某对象需要从另外一个对象中获取数据时,可以使用委托模式,在这种情境下,该模式也可以称为“数据源协议”(data source protocal)。

若有必要,可实现含有位段的结构体,将委托对象是否能响应相关协议方法这一信息缓存至其中。

// 头文件 
#import 
@class EOCNetworkFetcher;

@protocol EOCNetworkFetcherDelegate 
@optional
-(void)networkFetcher:(EOCNetworkFetcher *)fetcher didReceiveData:(NSData *)data;

-(void)networkFetcher:(EOCNetworkFetcher *)fetcher didFailWithError:(NSError *)error;

-(void)networkFetcher:(EOCNetworkFetcher *)fetcher didUpdateProgressTo:(float)progerss;
@end

@interface EOCNetworkFetcher : NSObject

@property (nonatomic, weak) id delegate;

@end

// 实现文件
#import "EOCNetworkFetcher.h"

@interface EOCNetworkFetcher() {
    // 使用含有位段的结构体
    struct {
        // 表示占用1个二进制位,可以表示0或1这两个值
        unsigned int didReceiveData      : 1;
        unsigned int didFailWithError    : 1;
        unsigned int didUpdateProgressTo : 1;
    }_delegateFlags;
}

@end

@implementation EOCNetworkFetcher

- (void)setDelegate:(id)delegate
{
    _delegate = delegate;
    _delegateFlags.didReceiveData = [delegate respondsToSelector:@selector(networkFetcher:didReceiveData:)];
    _delegateFlags.didFailWithError = [delegate respondsToSelector:@selector(networkFetcher:didFailWithError:)];
    _delegateFlags.didUpdateProgressTo = [delegate respondsToSelector:@selector(networkFetcher:didUpdateProgressTo:)];
}

- (void)didSomeThing
{
    // 调用delegate的相关方法
    if (_delegateFlags.didUpdateProgressTo) {
        [_delegate networkFetcher:self didUpdateProgressTo:0.5];
    }
}

@end

你可能感兴趣的:(第23条:通过委托与数据源协议进行对象间通信)