iOS开发-进阶:代理设计模式简介

在iOS开发中,很多情况下会用到代理模式,通过使用代理设计模式,我们可以实现当一个类(声明协议的类,后文简称A类)中的某个方法调用时,通知另一个类(简称B类),也就是在B类中实现A类协议中声明的方法.

代理设计模式实现步骤如下:

1.A类 .h文件中

@class LXWebServiceTool;

@protocol LXWebServiceToolDelegate <NSObject>

/**
 *  代理方法,成功返回JSON数据时调用
 *
 *  @param responseObj 返回的JSON数据
 */
- (void)LXWebServiceToolDidFinsihedXmlPar:(id)responseObj;

/**
 *  代理方法,失败返回JSON数据时调用
 *
 *  @param error 错误原因
 */
- (void)LXWebServiceToolDidFailedFinishXmlPar:(id)error;
@end
@property (nonatomic, weak) id<LXWebServiceToolDelegate> delegate;
1.1 @class 类名
1.2 @protocol 协议名 <NSObject>

1.3 定义代理的方法,就是当A类中某些方法调用时,会在B类执行的方法上面的代码定义了俩个方法,

1.4 定义一个类型为id的delegate属性 : @property (nonatomic, weak) id<LXWebServiceToolDelegate> delegate;


2.A类 .m文件中

在A类的方法中,那个方法执行过程中需要通知到B类,就在那个方法中使用如下代码;

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
    if ([elementName isEqualToString:matchingElement]) {
        elementFound = FALSE;
        // 强制放弃解析
        [xmlParser abortParsing];
        // 利用userdefaults存储获得的数据
        NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
        [user setObject:soapResults forKey:matchingElement];
        /**
         *  实现代理方法
         */
        if ([self.delegate respondsToSelector:@selector(LXWebServiceToolDidFinsihedXmlPar:)]) {
            [self.delegate LXWebServiceToolDidFinsihedXmlPar:soapResults];
        }
    }
}

上面代码实在 XML完成解析后,调用代理方法;

例如:

    failure:^(AFHTTPRequestOperation * _Nonnull operation, NSError * _Nonnull error) {
        // delegate
        if ([self.delegate respondsToSelector:@selector(LXWebServiceToolDidFailedFinishXmlPar:)]) {
            [self.delegate LXWebServiceToolDidFailedFinishXmlPar:error];
        }

在AFN框架中,网络返回错误是调用代理方法.


3.在B类 .m文件中

3.1 引入A类

#import "A类.h"

3.2 遵守A类的代理协议

@interface B类 ()<LXWebServiceToolDelegate>

3.3 创建A类,并且定义A类的delegate = self

A类 *tool = [[<span style="font-size: 12px; font-family: Arial, Helvetica, sans-serif;">A类 </span><span style="font-size: 12px; font-family: Arial, Helvetica, sans-serif;"> alloc] init];</span>
<span style="font-size: 12px; font-family: Arial, Helvetica, sans-serif;">tool.delegate = self;</span>
3.4 调用A类中协议下面的俩个方法,然后就实现了代理设计模式

- (void)LXWebServiceToolDidFinsihedXmlPar:(id)responseObj
{
<span style="white-space:pre">	</span>//在这里面做事情
}


<span style="color:#333333;">- (void)LXWebServiceToolDidFailedFinishXmlPar:(id)error
{
    <span style="white-space:pre">	</span>//在这里面做事情
}</span>

PS: 代理设计模式,就是这样了,如果有不清楚的地方欢迎留言交流~

你可能感兴趣的:(代理模式,ios开发)