咱們都知道協議代理,懂得如何去使用系統或者第三方的協議代理,php
知道使用的步驟:api
1.建立對象並設置代理網絡
2.遵循協議app
3.實現協議中的方法異步
但不知道大家有沒有本身去封裝過協議代理,知不知道內部是如何封裝的?atom
接下來,我用一個網絡請求的例子來進行一次簡單的封裝,深刻理解下封裝的內涵。url
1.建立一個繼承自NSObject的DDZHttpRequest類spa
定義頭文件(.h)代理
#import <Foundation/Foundation.h> //定義網絡請求協議 @protocol DDZHttpRequestDelegate <NSObject> //協議中定義一個下載數據的請求方法 - (void)getDownloadDataWithHttpRequest:(id)httpRequest; @end @interface DDZHttpRequest : NSObject <NSURLConnectionDataDelegate> /** 數據 */ @property (nonatomic,strong) NSMutableData *data; /** 持有協議的id指針(用於保存傳過來的delegate對象) */ @property (nonatomic,assign) id<DDZHttpRequestDelegate> 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); }
運行以後,就會在控制檯上打印出請求回來的數據。