对象之间需要相互通信,一种名叫“委托模式”的编程设计模式来实现对象之间的通信。
该模式主旨是:定义一套接口,某对象若想接受另一个对象的委托,则需要遵从此接口,以便成为其“委托对象”(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
网友评论