同步请求数据
同步请求会停止阻塞主线程,等待请求的服务器返回数据,处理后才会接着执行下面的程序
同步请求示例代码如下:
- (void)synsRequestWithConnection
{
//URL 地址
NSString *path = [NSString stringWithFormat: @"http://10.0.8.8/sns/my/user_list.php?page=%d&number=%d",1,20];
//字符串转换Url
NSURL * url = [NSURL URLWithString:path];
//设置url请求
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//同步请求
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
//解析数据
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSLog(@"dict = %@",dict.description);
}
异步请求
异步请求不会阻塞主线程,向服务器发送请求之后,主线程可以继续做其他事情,而不必等待请求完成,请求完成后会返回一个反馈信息,通知相应的代理方法处理数据。
异步请求方式1,NSURLConnection请求,连接类, 和服务器建立连接并用来接收服务器的数据,注意,它内部会开辟一个新的线程和服务器交互,所以界面不会卡,不影响主线程代码的执行,此方法ios之前使用较多,具体代码如下:
- (void)asynsRequestWithConnection
{
//URL 地址
NSString *path = [NSString stringWithFormat: @"http://10.0.8.8/sns/my/user_list.php?page=%d&number=%d",1,20];
//字符串转换Url
NSURL * url = [NSURL URLWithString:path];
//设置url请求
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//创建URLConnection对象
//使用代理
NSURLConnection *connect = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];
[connect start];//yes的话,此方法可以省略
}
NSURLConnection代理方法
实现NSURLConnectionDataDelegate,NSURLConnectionDelegate代理
pragma mark - 代理方法
//请求失败
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
//请求失败,比如超时 time out
NSLog(@"error = %@",error.localizedDescription);
}
//服务器应答
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
//服务器应答
//http 协议
NSHTTPURLResponse *respose = (id)response;
//status code
//200 请求成功
//404 请求失败
//400 客户端错误
//500 服务器端错误
NSLog(@"staus code = %ld",respose.statusCode);
//对数据进行初始化
_mydata = [NSMutableData data];
}
//服务器返回数据,如果数据较大则会频繁调用
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
//发送数据
[_mydata appendData:data];
}
//请求结束,数据返回完成
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
//请求结束了
//对数据进行解析
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:_mydata options:NSJSONReadingMutableContainers error:nil];
NSLog(@"异步请求 dict = %@",dict);
}
NSURLSession类进行异步请求
NSURLSession异步请求是在iOS7之后使用的方法,是使用block方法对数据进行处理,现在使用较多,示例代码如下:
- (void)asynsRequestWithSession
{
//URL 地址
NSString *path = [NSString stringWithFormat: @"http://10.0.8.8/sns/my/user_list.php?page=%d&number=%d",1,20];
//字符串转换Url
NSURL * url = [NSURL URLWithString:path];
//创建session类,单例
NSURLSession *session = [NSURLSession sharedSession];
//session 有三个task 1.DataTask 2.uploadTask 3.downloadTask
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:[NSURLRequest requestWithURL:url] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSLog(@"session: dict = %@",dict);
}];
//开始异步请求
[dataTask resume];
}
本文介绍了iOS开发中同步与异步网络请求的区别及其实现方法。同步请求会阻塞主线程直到请求完成,而异步请求则允许主线程继续执行其他任务。文章通过具体的示例代码展示了使用NSURLConnection和NSURLSession进行网络请求的具体步骤。
1626

被折叠的 条评论
为什么被折叠?



