天天看点

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];

}
//协议遵循的办法已经在上面写出,此处不重复