zoukankan      html  css  js  c++  java
  • iOS ASI--GET请求

    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 = 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];

    }

    2.3  异步请求之Block,ASI提供了用Block替代delegate的方式,可以使代码更加精简

        // 设置url

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

        // 设置请求

        self.request = [ASIHTTPRequest requestWithURL:url];

        [self.request setStartedBlock:^{

            NSLog(@"开始请求");

        }];

        [self.request setDataReceivedBlock:^(NSData *data) {

            NSLog(@"正在接收数据");

        }];

        [self.request setCompletionBlock:^{

            NSLog(@"请求完成");

        }];

        [self.request setFailedBlock:^{

            NSLog(@"请求失败");

        }];

        // 发起请求

        [self.request startAsynchronous];

    2.4 异步请求之SEL

        // 设置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 setDidStartSelector:@selector(start)]; // 设置了selector, ASIHTTPRequestDelegate的requestStarted:方法就会被覆盖

        // 发起请求

        [self.request startAsynchronous];

    - (void)start{

        NSLog(@"开始请求");

    }

  • 相关阅读:
    【AtCoder】ARC097 (C
    【51nod】1123 X^A Mod B (任意模数的K次剩余)
    【洛谷】P4207 [NOI2005]月下柠檬树
    【POJ】2454.Jersey Politics
    【POJ】2069.Super Star
    【POJ】2420.A Star not a Tree?(模拟退火)
    【POJ】1026.Cipher
    【POJ】3270.Cow Sorting
    【POJ】1286.Necklace of Beads
    【POJ】1067.取石子游戏
  • 原文地址:https://www.cnblogs.com/oumygade/p/4249155.html
Copyright © 2011-2022 走看看