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

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

作者: MrSYLong | 来源:发表于2018-09-23 23:14 被阅读14次

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

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

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

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

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

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

    // 头文件 
    #import <Foundation/Foundation.h>
    @class EOCNetworkFetcher;
    
    @protocol EOCNetworkFetcherDelegate <NSObject>
    @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<EOCNetworkFetcherDelegate> 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<EOCNetworkFetcherDelegate>)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条:通过委托与数据源协议进行对象间通信

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