您的位置:首页 > 理论基础 > 计算机网络

iOS网络数据请求

2016-05-09 21:34 423 查看

iOS网络数据请求

作者:马仔哥

应大家的要求,我在这讲一下有关网络请求的知识,这是网络请求最基础的东西,是没有封装过的 大家需要源码的话可以关注我的微博

IT一散人

给我发私信 我会第一时间发给你,

关与iOS其它的知识,大家有不懂的可以在微博上和我互动

网络数据请求

1.同步:在同一个时间点,只可以做一件事情
2.异步:在同一个时间点,可以同时做多件事情

比较同步和异步
1.当下载的数据比较小的时候使用同步,反之使用异步
2.需要上传数据的时候使用异步,例如:上传图片
3.一般情况下(排除网速等物理环境影响),异步的效率比同步效率要高


同步请求

1.使用NSString直接下载数据(同步)

- (void)testDownloadDataWithString {
//1.拿到网址(字符串)
NSString *path = 接口路径;

//2.创建NSURL对象,url:统一资源标识符(统一资源定位器)
NSURL *url = [NSURL URLWithString:path];

//3.使用NSString直接下载数据(同步) ,编码格式一般都用UTF-8
NSError *error;
NSString *string = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
if (error) { //如果error有值的话,代表报错 直接打印错误 否则 成功
NSLog(@"error:%@",error);
}else {
NSLog(@"string:%@",string);
}
}


使用NSURLConnection的同步方法下载数据

- (void)testDownloadDataWithURLConnectionSyn {

//1.拿到网址路径
NSString *path = 接口路径;
//2.创建url对象
NSURL *url = [NSURL URLWithString:path];

//3.获取请求对象,通过url对象得到请求对象
NSURLRequest *request = [NSURLRequest requestWithURL:url];

//4.用NSURLConnection进行发送同步请求 获取NSData数据类型 记住:此方法在iOS9.0之后不支持了
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

//5.JSON解析
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

NSLog(@"%@",dic);

}


异步的方法

使用NSURLConnection的异步方法下载数据

- (void)testDownloadDataWithURLConnectionAsyn {

//1.拿到网址路径
NSString *path = 接口路径;
//2.创建url对象
NSURL *url = [NSURL URLWithString:path];
//3.获取请求对象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//4.NSURLConnection发送异步请求
//第一个参数:请求对象 第二个参数:代理
NSURLConnection *urlConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];

}

#pragma mark - NSURLConnectionDataDelegate -

//遵循协议 实现协议中的方法

//接收到响应 请求开始
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
NSLog(@"接到响应,请求开始(请求成功)");

NSHTTPURLResponse *httpURLResponse = (NSHTTPURLResponse *)response;
//200:正常响应 404请求失败 400:客户端有问题 500:服务端有问题
//注意:服务端和客户端可以模拟(自定义)自己的状态码
if (httpURLResponse.statusCode == 200) {
NSLog(@"正常响应");
}else {
NSLog(@"请求有问题 %ld",httpURLResponse.statusCode);

}
//初始化成员变量_data
_data = [[NSMutableData alloc] init];

}

//接收到数据,请求数据过程中 注意:这个过程是异步的,如果响应数据过大的话需要拼接data
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
NSLog(@"接收数据过程中");
[_data appendData:data];
}

//数据接收完毕后,结束请求响应
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {

NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:_data options:NSJSONReadingMutableContainers error:nil];
NSLog(@"结束请求:%@",dic);

}

//请求失败
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {

NSLog(@"错误:%@",error);
}


用NSURLSession的异步方法去下载数据 注意:NSURLSession是iOS7.0版本出现

- (void)testDownloadDataWithURLSessionAsyn {

//1.
NSString *path = 接口路径;
//2.
NSURL *url = [NSURL URLWithString:path];

//3.创建session单例对象 shared开头的单例对象
NSURLSession *session = [NSURLSession sharedSession];

//4.创建任务
//第一个参数是url对象 第二个参数是代码块(完成结果的代码块)

NSURLSessionDataTask *dataTask1 = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

NSHTTPURLResponse *response1 = (NSHTTPURLResponse *)response;
NSLog(@"状态码:%ld",response1.statusCode);

NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

NSLog(@"%@",dic);

}];

//5.启动下载
[dataTask1 resume];

NSURLSessionDataTask *dataTask2 = [session dataTaskWithURL:[NSURL URLWithString:图片路径] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

NSLog(@"%@",data);
//Data 可以向不同的类型转换
self.myImageView.image = [UIImage imageWithData:data];

}];
[dataTask2 resume];

/*
了解
NSURLSessionDataTask 默认的样式 可以上传内容 ,上传完成后再进行下载
NSURLSessionUploadTask 主要用于上传数据使用,传完以后不会再下载返回结果
NSURLSessionDownloadTask 必须有下载数据
*/

}


#####你提问题我尽量解答 -- IT一散人
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios 网络 数据 微博 异步