您的位置:首页 > 移动开发 > IOS开发

iOS激情详解之URL同步,异步连接

2015-09-17 13:19 176 查看
//
//  GetViewController.m
//  NSURLRequest
//
//  Created by WDX on 15/9/11.

//  Copyright (c) 2015年 WDongXu. All rights reserved.
//

#import "GetViewController.h"
@interface GetViewController ()<NSURLConnectionDataDelegate,NSURLConnectionDelegate> //遵守协议// 加载错误时用NSURLConnectionDelegate

// 声明一个可变的data,用来凭借完整的数据

@property (nonatomic ,retain)NSMutableData *data;
// 声明一个链接属性,用于终止网络请求

@property (nonatomic, retain)NSURLConnection *connection ;

@end


</pre><pre name="code" class="objc">@implementation GetViewController

- (void)dealloc
{
    // 如果本页面被销毁 那么要终止网络请求
    [_connection cancel];
    [_connection release];
    [ _data release];
    [super dealloc];
}

- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationItem.title = @“子敬";
    [self addBarButton];
}
- (void)addBarButton
{
    self.view.backgroundColor = [UIColor redColor];
    UIBarButtonItem *leftButton = [[UIBarButtonItem alloc] initWithTitle:@"同步" style:(UIBarButtonItemStylePlain) target:self action:@selector(actionLeftButton:)];
    self.navigationItem.leftBarButtonItem = leftButton;
    [leftButton release];
    UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithTitle:@"异步" style:(UIBarButtonItemStylePlain) target:self action:@selector(actionRightButton:)];
    self.navigationItem.rightBarButtonItem = rightButton;
    [rightButton release];
}


// GET同步请求

- (void)actionLeftButton:(UIBarButtonItem *)button
{
    NSLog(@"同步");
    // 1,创建网址对象
    NSString *oldUrl = kSearchURL;
    // 2,如果你请求的网址中带有中文必须进行重新编码,一般用NSUTF8StringEncoding
    NSString *newUrl = [oldUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    // 把字符串变成网址对象
    NSURL *url = [NSURL URLWithString:newUrl];

    // 发出一个请求
    // cachePolicy 缓存策略一般选择默选择策略
    // timeoutInterval 请求超时时间设置30秒
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:(NSURLRequestUseProtocolCachePolicy) timeoutInterval:30.0];
    // 默认是get请求:NSURLRequest    如果要是设置的话就是可变请求
    // 设置请求路径
    [request setHTTPMethod:@"GET"];
    // 建立链接
    // 接收二进制数据
    // response服务器返回的描述服务器的数据
    // error 连接错误信息
    // 你不需要的话描述服务器的数据和错误信息可以直接填写nil
    NSURLResponse *response = nil;
    NSError *error = nil;
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

    // NSLog(@"%@",response);
    // 转换成咱们需要的数据 json数据
    NSMutableDictionary *dataDic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
    NSLog(@"%@", dataDic);
}


// GET异步请求
- (void)actionRightButton:(UIBarButtonItem *)button
{
    // 1,如果你请求的网址中带有中文 必须进行重新编码 一般用NSUTF8StringEncoding
    NSString *newUrl = [kImageURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    // 2,利用网址字符串创建一个网址对象
    NSURL *url = [NSURL URLWithString:newUrl];
    // 3,利用网址对象创建一个请求
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:(NSURLRequestUseProtocolCachePolicy) timeoutInterval:30.0];
    // 4,设置请求类型
    [request setHTTPMethod:@"GET"];
    // 前四步与同步请求一样

#pragma mark --  异步请求利用 Block方法:
    // 建立一个异步请求的链接
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
     // 异步请求相当于开启一个子线程去加载数据
     // 数据加载完成调用block回到主线程
     // 打印是否主线程
        NSLog(@"%d", [NSThread isMainThread]);
    }];
#pragma mark --  异步请求利用代理方法实现
    // 利用请求创建一个链接 注意:同步异步有区别
    // 设置协议  遵守的协议名字:NSURLConnectionDataDelegate
    self.connection = [NSURLConnection connectionWithRequest:request delegate:self];
    // 开启异步请求
    [self.connection start];
}


#pragma mark—  NSURLConnectionDataDelegate
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    // 触发方法,链接成功,初始化可变data
    self.data = [NSMutableData data];
    NSLog(@"接收到服务器数据,说明链接成功");
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    // 拼接data
    [self.data appendData:data];
    NSLog(@"接收数据时触发");
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
   // 该方法触发说明data已经完整了,接下来可以解析数据
     // 转换成咱们需要的数据,json数据

      NSMutableDictionary *dataDic = [NSJSONSerialization JSONObjectWithData:self.data options:NSJSONReadingMutableContainers error:nil];

    NSLog(@"已经完成加载");
}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    NSLog(@"查看错误信息");
}
@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: