首页 > 代码库 > iOS ASI--同步和异步请求

iOS ASI--同步和异步请求

1.添加ASI框架到项目

1>ASI框架在判断网络状态时,依赖于Reachability,可以在苹果的官方文档里找到,也可以ASI的Sample例子里找到.

2>添加ASI所依赖的类库: SystemConfiguration是Reachability所需要的类库

技术分享

3>如果是ARC项目,还要在Targets-Compile Sources-Compiler Flags里把ASI的.m文件,都置为 -fno-objc-arc

4>最后编译程序,看成功否

 

2.发起请求

2.1同步请求

    // 设置url

    NSURL *url = [NSURL URLWithString:@"http://api.openweathermap.org/data/2.5/weather?lat=35&lon=139"];

    // 设置请求

    ASIHTTPRequest * request = [ASIHTTPRequest requestWithURL:url];

    request.timeOutSeconds = 10;

    // 发起请求

    [request startSynchronous];

    // 拿到服务器返回的数据

    if (request.error) {

        NSLog(@"有错");

    }else{

        NSLog(@"状态码%d",request.responseStatusCode);

        NSLog(@"返回的信息:%@",request.responseString);

        

        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:request.responseData options:NSJSONReadingMutableLeaves error:nil];

        NSLog(@"dict------%@",dict);

    }

2.2 异步请求

    // 设置url

    NSURL *url = [NSURL URLWithString:@"http://api.openweathermap.org/data/2.5/weather?lat=35&lon=139"];

    // 设置请求

    ASIHTTPRequest * request = [ASIHTTPRequest requestWithURL:url];

    // 设置代理

    request.delegate = self;

    // 发起请求

    [request startAsynchronous];

#pragma mark - ASIHTTPRequestDelegate

-(void)requestStarted:(ASIHTTPRequest *)request{   

  NSLog(@"开始请求");  

}

- (void)request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data{  

  NSLog(@"正在接收服务器返回的数据"); // 该方法可能会被调多次,因为要拼接数据  

}

- (void)requestFinished:(ASIHTTPRequest *)request{    

  NSLog(@"请求结束");

      NSData *data = http://www.mamicode.com/request.responseData; // 这样就可以拿到请求完成的最终数据  

}

- (void)requestFailed:(ASIHTTPRequest *)request{

    NSLog(@"请求失败");

}

用ASI做异步请求的坑点:

  假设某应该有A,B两个控制器,点A控制器的导航按钮会跳到B控制器.在控制器B发起异步请求,请求正在进行中(也就是正在调代理方法request:didReceiveData:),此时点了返回键,返回到A控制器,也就是把B控制器干掉了,按上面异步请求代码会报坏内存访问的错误

  因为request.delegate = B控制器,请求正在进行时,B控制器正在执行 [self  request:xx didReceiveData:xx];如果把B控制器干掉,程序在执行[self  request:xx didReceiveData:xx]这个方法时,找不到B控制器了,就会报坏内存访问的Error.

  解决这个坑点的办法,在B控制的dealloc里把请求清除掉.标蓝代码是修改的代码

 @property (nonatomic,strong) ASIHTTPRequest *request;

    // 设置url

    NSURL *url = [NSURL URLWithString:@"http://api.openweathermap.org/data/2.5/weather?lat=35&lon=139"];

    // 设置请求

    self.request = [ASIHTTPRequest requestWithURL:url];

    // 设置代理

    self.request.delegate = self;

    // 发起请求

    [self.request startAsynchronous];

 

- (void)dealloc {

    [self.request clearDelegatesAndCancel];

}

 

iOS ASI--同步和异步请求