同步意为着线程阻塞,在主线程中使用此方法会不响应任何用户事件。所以,在应用程序设计时,大多被用在专门的子线程增加用户体验,或用异步请求代替。AD:2014WOT全球软件技术峰会北京站 课程视频发
1. 同步意为着线程阻塞,在主线程中使用此方法会不响应任何用户事件。程序容易出现卡死现象.所以,在应用程序设计时,大多被用在专门的子线程增加用户体验,或用异步请求代替。
url,统⼀一资源定位符,也被称为⺴⽹网址,因特⺴⽹网上标准的资源⺴⽹网址
⼀一个典型的url:http://lily:[email protected]/search?hl=en&source=hp&q=mysql&aq=f&oq=&aqi=g10#page
url的符语法: 协议://授权/路径?查询
协议:ftp://(⽂文件传输协议) http://(超⽂文本传输协议)https://(安全超文本传输协议) file://(本地文件协议)
//网址分为两部分,第一部分:问号之前的内容,即网址所请求的文件按所在的服务器路径,第二部分:问号之后的内容,即向相对文件所传输的参数---针对于GET请求
-(NSData *)startConnect{
//第一步:准备网址
NSString *urlStr = @"http://project.lanou3g.com/teacher/yihuiyun/lanouproject/activitylist.php";
//第二步:将网址进行封装,包含请求方式
NSURL *url = [NSURL URLWithString:urlStr];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//告诉接下来的网络请求连接,这个网络请求是什么样的网络
[request setHTTPMethod:@"GET"];
//第三步:连接服务器,同步
NSURLResponse *response = nil;
NSData *connection = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];
//NSLog(@"%@",connection);
//打印服务器返回信息
NSHTTPURLResponse *res = (NSHTTPURLResponse *)response;
NSDictionary *values = res.allHeaderFields;
NSLog(@"values = %@",values);
//将connection转化为可读的文本,用于分析
NSString *str = [[NSString alloc]initWithData:connection encoding:NSUTF8StringEncoding];
NSLog(@"%@",str);
return connection;
}
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self creat];
}
-(void)creat{
SyncGet *get = [[SyncGet alloc]init];
NSData *data =[get startConnect];
//在网站上数据存放的形式,通过JSON进行解析,根据关键字获取所需要的内容.
NSMutableDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSArray *events = [dic objectForKey:@"events"];
for (NSMutableDictionary *dic1 in events) {
NSString *adapt_url = [dic1 objectForKey:@"adapt_url"];
NSLog(@"adapt_url = %@",adapt_url);
}
}
2. 异步请求的好处是不阻塞当前线程,但相对于同步请求略为复杂,至少要添加两个回调方法来获取异步事件,等待数据返回.
//设置NSURLConnection代理NSURLConnectionDataDelegate
-(void)startConnect:(NSString *)urlStr{
NSURL *url = [NSURL URLWithString:urlStr];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//请求方式
[request setHTTPMethod:@"GET"];
//连接服务器,异步网络请求,通过协议来完成
[NSURLConnection connectionWithRequest:request delegate:self];
}
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
//获取服务器响应,根据⺴络请求协议,封装了服务器返回数据的部分信息。服务器响应⺴络请求后,返回数据的部分信息及数据本⾝身
NSLog(@"1");
}
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
//接收数据
NSLog(@"2");
//由于网络原因,接受的数据的方法会走很多次,因此需要将每次接受的数据拼接起来
[_receiveData appendData:data];
NSLog(@"%@",_receiveData);
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
//接收完成
NSLog(@"3");
}