博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
封装网络请求
阅读量:5146 次
发布时间:2019-06-13

本文共 2580 字,大约阅读时间需要 8 分钟。

我们都知道协议代理,懂得如何去使用系统或者第三方的协议代理,

知道使用的步骤:

1.创建对象并设置代理

2.遵循协议

3.实现协议中的方法

 

但不知道你们有没有自己去封装过协议代理,知不知道内部是如何封装的?

 

接下来,我用一个网络请求的例子来进行一次简单的封装,深入理解下封装的内涵。

 

1.创建一个继承自NSObject的DDZHttpRequest类

 

定义头文件(.h)

#import 
//定义网络请求协议@protocol DDZHttpRequestDelegate
//协议中定义一个下载数据的请求方法- (void)getDownloadDataWithHttpRequest:(id)httpRequest;@end@interface DDZHttpRequest : NSObject
/** 数据 */@property (nonatomic,strong) NSMutableData *data;/** 持有协议的id指针(用于保存传过来的delegate对象) */@property (nonatomic,assign) id
delegate;//构造方法- (id)initWithHttpRequest:(NSString *)requestPath andDelegate:(id)delegate;@end

 

 

实现文件(.m)

#import "DDZHttpRequest.h"@implementation DDZHttpRequest- (id)initWithHttpRequest:(NSString *)requestPath andDelegate:(id)delegate {    if (self = [super init]) {        //进行封装对NSURLConnection进行封装                //创建URL对象        NSURL *url = [NSURL URLWithString:requestPath];        //保留(记录)外面传过来的delegate        self.delegate = delegate;                //发送异步请求        NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:[NSURLRequest requestWithURL:url] delegate:self];                    }        return self;}- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {    NSLog(@"开始请求");    _data = [NSMutableData data];}- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {    NSLog(@"请求过程中");    [_data appendData:data];}- (void)connectionDidFinishLoading:(NSURLConnection *)connection {    NSLog(@"结束");    //持有协议的id指针,可以使用协议中的方法    //self:是DDZHttpRequest的当前对象 记住:只要self在哪个类里就是哪个类的当前对象    [self.delegate getDownloadDataWithHttpRequest:self];}- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {    NSLog(@"%@",error);}@end

 

在构造方法中,我们将传进来的delegate进行保留,用于数据请求结束时,使传进来的对象调用协议方法,并将数据data也传出去。

这样我们的封装就大功告成了!

 

2.在ViewController文件中,

- (void)viewDidLoad {    [super viewDidLoad];    // Do any additional setup after loading the view, typically from a nib.        DDZHttpRequest *httpRequest = [[DDZHttpRequest alloc] initWithHttpRequest:@"http://api.budejie.com/api/api_open.php?a=tags_list&c=subscribe" andDelegate:self];    }/* 调用的开发者: 1.创建对象并设置代理 2.遵循协议 3.实现协议中的方法 */- (void)getDownloadDataWithHttpRequest:(id)httpRequest {        DDZHttpRequest *request = httpRequest;        NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:request.data options:NSJSONReadingMutableContainers error:nil];        NSLog(@"%@",dic);}

 

运行之后,就会在控制台上打印出请求回来的数据。

转载于:https://www.cnblogs.com/langji/p/5601652.html

你可能感兴趣的文章
javascript:window.history.go(-1)
查看>>
Leetcode zigzag conversion
查看>>
字母统计
查看>>
在windows下用vagrant建立lnmp开发环境
查看>>
线段树(基础)
查看>>
torchvision的安装及使用
查看>>
使用UML进行项目开发
查看>>
Windows phone 8.1布局控件
查看>>
easyui中表格列之间的换位05
查看>>
SSL-ZYC 采购特价商品【SPFA】
查看>>
软工作业 2:时事点评-红芯浏览器事件
查看>>
文法 LL1
查看>>
ubuntu 下 tar解压是出错
查看>>
从var func=function 和 function func()区别谈Javascript的预解析机制
查看>>
POJ1190 洛谷P1731 NOI1999 生日蛋糕
查看>>
Uva116 Unidirectional TSP
查看>>
GYM100633J. Ceizenpok’s formula 扩展lucas模板
查看>>
Python模块--time&datetime
查看>>
C# 创建XML并输出XML
查看>>
网页里动态加载js
查看>>