在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.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]; } } }
例如:
failure:^(AFHTTPRequestOperation * _Nonnull operation, NSError * _Nonnull error) { // delegate if ([self.delegate respondsToSelector:@selector(LXWebServiceToolDidFailedFinishXmlPar:)]) { [self.delegate LXWebServiceToolDidFailedFinishXmlPar:error]; }
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>