1. 程式人生 > >Snail—iOS網絡學習之得到網絡上的數據

Snail—iOS網絡學習之得到網絡上的數據

interface rms task conn log esp self. 響應 url

在開發項目project中,尤其是手機APP,一般都是先把界面給搭建出來。然後再從網上down數據 來填充

那麽網上的數據是怎麽得來的呢,網絡上的數據無非就經常使用的兩種JSON和XML

如今 大部分都是在用JSON

網絡上數據傳輸都是以二進制形式進行傳輸的 ,僅僅要我們得到網上的二進制數據

假設它是JSON的二進制形式 那麽我們就能夠用JSON進行解析 假設是XML。那麽我們能夠用XML解析

關鍵是怎麽得到網上的二進制數據呢

設計一個經常使用的工具類 非常easy 給我一個接口(URL),那我就能夠用這個類得到二進制文件

新建了一個類WJJHttpReques 繼承NSObject

以下是.h的代碼

#import <Foundation/Foundation.h>

@interface WJJHttpRequest : NSObject

//請求的接口
@property (nonatomic,copy) NSString * httpUrl;
//網上下載的二進制文件
@property (nonatomic,strong) NSMutableData * data;
//代理
@property (nonatomic,strong) id delegate;
//代理的方法
@property (nonatomic,assign) SEL method;

//開始下載數據
- (void)start;
//斷開連接
- (void)stop;

@end

#import "WJJHttpRequest.h"
#import "WJJRequestManager.h"

@interface WJJHttpRequest ()<NSURLConnectionDataDelegate>{
    //聲明connection為全局變量
    NSURLConnection * _connection;
}

@end

@implementation WJJHttpRequest

//開始下載數據
- (void)start{
    NSURL * url = [NSURL URLWithString:self.httpUrl];
    NSURLRequest * request = [[NSURLRequest alloc] initWithURL:url];
    //僅僅要以下運行 那麽代理方法就會運行了 然後開始從網上down數據
    _connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
}

#pragma mark NSURLConnectionDataDelegate method
//收到server的響應調用的代理方法
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
    NSLog(@"收到server響應");
    if (self.data == nil) {
        self.data = [[NSMutableData alloc] init];
    }else{
        [self.data setLength:0];
    }
}

//接受server的二進制文件
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
    NSLog(@"接受到了server的二進制數據");
    [self.data appendData:data];
}

//假設成功了 參數就是YES 反之則是NO
- (void)loadFinished:(BOOL)success{
    if (!success) {
        [self.data setLength:0];
    }
    //檢測要接收數據的回調對象 是否有method這種方法
    if ([self.delegate respondsToSelector:self.method]) {
        //假設有就運行這種方法 而且把自己當參數傳過去
        [self.delegate performSelector:self.method withObject:self];
    }
    //這個是我自己設計的Request管理類 以下這句話的意思就是把 數據傳給那些須要數據的地方後,把這個連接斷開
    [[WJJRequestManager sharedManager] removeTask:self.httpUrl];
}

//接受數據完畢時調用的方法
- (void)connectionDidFinishLoading:(NSURLConnection *)connection{
    NSLog(@"數據接受完畢");
    [self loadFinished:YES];
}

//接收數據失敗時調用的方法
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
    NSLog(@"數據請求失敗");
    [self loadFinished:NO];
}

//停止下載數據
- (void)stop{
    if (_connection) {
        //取消連接
        [_connection cancel];
    }
    _connection = nil;
}

@end


Snail—iOS網絡學習之得到網絡上的數據