天天看點

OC-NSURLConnection-同步get、異步get、同步post、異步post

NSURLConnection的常用類

NSURL:請求位址
NSURLRequest:封裝一個請求,儲存發給伺服器的全部資料,包括一個NSURL對象,請求方法、請求頭、請求體....
NSMutableURLRequest:NSURLRequest的子類
NSURLConnection:負責發送請求,建立用戶端和伺服器的連接配接。發送NSURLRequest的資料給伺服器,并收集來自伺服器的響應資料
           

使用 NSURLConnection 分别實作同步get、異步get、同步post、異步post

首先我們建立一個工程,在UI界面加入一個text,四個button,如圖所示:

OC-NSURLConnection-同步get、異步get、同步post、異步post

我們以微網誌為例,實作接收微網誌,發送微網誌。

首先我們找到相關的API,進入新浪公共平台,如圖所示:

OC-NSURLConnection-同步get、異步get、同步post、異步post

實作同步get:

//在這之前我們建立一個WeiBoModel類,聲明六個屬性,分别與最外層字典的每一個元素對應,并聲明一個initWithDictionary: 方法
@property (nonatomic,strong)NSArray *statuses;
@property (nonatomic,strong)NSNumber *hasvisible;
@property (nonatomic,strong)NSNumber *previous_cursor;
@property (nonatomic,strong)NSNumber *next_cursor;
@property (nonatomic,strong)NSNumber *total_number;
@property (nonatomic,strong)NSNumber *interval;
- (id)initWithDictionary:(NSDictionary *)dictionary;
           
- (IBAction)synchronizedGet:(UIButton *)sender {
NSString *urlstring = @"https://api.weibo.com/2/statuses/public_timeline.json?access_token=2.00xSFqpCYTVpIB59d7f3a4de0NCrgJ";
urlstring = [urlstring stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
NSURL *url = [NSURL URLWithString:urlstring];

//建立一個url請求,request
NSURLRequest *request = [NSURLRequest requestWithURL:url                  cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:];

NSURLResponse *httpUrlResponse;
NSError *error;
//使用 NSURLConnection 類,和伺服器連接配接,同步過程
NSData *data = [NSURLConnection sendSynchronousRequest:request 
returningResponse:&httpUrlResponse                                            error:&error];

//JSON資料格式解析,利用系統提供的API進行JSON資料的解析
NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];

WeiBoModel *model = [[WeiBoModel alloc] initWithDictionary:dictionary];

//逐層找出我們想要的資訊,即第一條最新微網誌裡面的text
NSString *text = [model.statuses[]objectForKey:@"text"];

self.textView.text = text;
}
           

異步get:

- (IBAction)AsynchronizedGet:(UIButton *)sender {
NSString *urlstring = @"https://api.weibo.com/2/statuses/public_timeline.json?access_token=2.00xSFqpCYTVpIB59d7f3a4de0NCrgJ";
urlstring = [urlstring stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
NSURL *url = [NSURL URLWithString:urlstring];

//建立一個url請求,request
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:];

[NSURLConnection sendAsynchronousRequest:request 
queue:[NSOperationQueue mainQueue]                          completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { 
    NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil]; *model = [[WeiBoModel alloc]initWithDictionary:dictionary];
    NSString *text = [model.statuses[]objectForKey:@"text"];
                                                                           dispatch_async(dispatch_get_main_queue(), ^{
        self.textView.text = text;
        });

    }];

}
           

實作異步get還有另外一個方法,即使用代理:

- (IBAction)AsynchronizedGet:(UIButton *)sender {

NSString *urlstring = @"https://api.weibo.com/2/statuses/public_timeline.json?access_token=2.00xSFqpCYTVpIB59d7f3a4de0NCrgJ";

urlstring = [urlstring stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];

NSURL *url = [NSURL URLWithString:urlstring];

//建立一個url請求,request
NSURLRequest *request = [NSURLRequest requestWithURL:url                                             cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:];

_connectionGet = [NSURLConnection connectionWithRequest:request delegate:self];
}
           
//因為異步get與與等一下要講的異步post遵循同一個協定,是以我們必須對不同情況進行區分,我們聲明四個全局變量,其中data用于接收資料,connection用于判斷
{
    NSMutableData *_mDataGet;
    NSMutableData *_mDataPost;
    NSURLConnection *_connectionGet;
    NSURLConnection *_connectionPost;

}
           

使用代理來實作異步get,需要遵循 NSURLConnectionDataDelegate 協定,并重寫三個方法,如下所示:

//伺服器開始響應,準備向客戶發送資料
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{

NSLog(@"伺服器開始響應,準備向客戶發送資料");

    if (connection == _connectionGet) {
        _mDataGet = [NSMutableData data];
    }

//此處為異步post相關處理
    if (connection == _connectionPost) {
        _mDataPost = [NSMutableData data];
    }

}
           
//從伺服器接收到資料,并且此方法會執行多次
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{

NSLog(@"從伺服器接收到資料,并且此方法會執行多次");

    if (connection == _connectionGet) {
        [_mDataGet appendData:data];
    }

//此處為異步post相關處理
    if (connection == _connectionPost) {
        [_mDataPost appendData:data];
    }

}
           
//接受資料完成
- (void)connectionDidFinishLoading:(NSURLConnection *)connection{
    NSLog(@"接受資料完成");

    if (connection == _connectionGet) {
        NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:_mDataGet
                                                                   options:NSJSONReadingAllowFragments
                                                                     error:nil];

        WeiBoModel *model = [[WeiBoModel alloc]initWithDictionary:dictionary];
        NSString *text = [model.statuses[]objectForKey:@"text"];

//更新UI需要回到主線程
//self.textView.text = text;
//回到主線程的兩種方式
[self.textView performSelectorOnMainThread:@selector(setText:)
                                        withObject:text
                                     waitUntilDone:NO];
    dispatch_async(dispatch_get_main_queue(), ^{
            self.textView.text = text;
        });
    }

//此處為異步post相關處理
    if (connection == _connectionPost) {
        NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:_mDataPost
                                                                   options:NSJSONReadingAllowFragments
                                                                     error:nil];
    }
}
           

同步post

- (IBAction)synchronizePost:(UIButton *)sender {

NSString *urlString = @"https://api.weibo.com/2/statuses/update.json";

urlString = [urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];

NSURL *url = [NSURL URLWithString:urlString];

NSMutableURLRequest *mRequest = [NSMutableURLRequest requestWithURL:url                                            cachePolicy:                                                   timeoutInterval:];

//将請求參數轉化成NSData
NSString *bodyString = @"status=��&access_token=2.00xSFqpCYTVpIB59d7f3a4de0NCrgJ";
NSData *data = [bodyString dataUsingEncoding:];

//post 設定它的方法體
[mRequest setHTTPMethod:@"POST"];
[mRequest setHTTPBody:data];


NSData *resultData = [NSURLConnection sendSynchronousRequest:mRequest                        returningResponse:nil                                                error:nil];

NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:resultData options:NSJSONReadingAllowFragments                                                                 error:nil];
}
           

異步post

- (IBAction)AsynchronizePost:(UIButton *)sender {

NSString *urlString = @"https://api.weibo.com/2/statuses/update.json";

urlString = [urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];

NSURL *url = [NSURL URLWithString:urlString];

NSMutableURLRequest *mRequest = [NSMutableURLRequest requestWithURL:url                                                          cachePolicy:                                               timeoutInterval:];

NSString *bodyString = @"status=��&access_token=2.00xSFqpCYTVpIB59d7f3a4de0NCrgJ";
NSData *data = [bodyString dataUsingEncoding:];

[mRequest setHTTPMethod:@"POST"];
[mRequest setHTTPBody:data];

_connectionPost = [NSURLConnection connectionWithRequest:mRequest delegate:self];

}
//協定遵循的辦法已經在上面寫出,此處不重複