封裝網絡請求

咱們都知道協議代理,懂得如何去使用系統或者第三方的協議代理,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);
}

 

運行以後,就會在控制檯上打印出請求回來的數據。

相關文章
相關標籤/搜索