ASI框架的使用

作者: 董军1990 | 来源:发表于2015-06-01 01:20 被阅读2962次

    ASI框架的使用

    • 1.同步访问
    • 2.异步访问
    • 3.块代码方式
    • 4.指定selector方法
    • 5.POST登陆
    • 6.POST JSON
    • 7.下载文件
    • 8.断点续传
    • 9.上传文件
    • 10.野指针
    导入ASI框架

    我们需要导入我们需要的一需要的一些文件
    以上的文件都需要在 Build Phases\Compile Sourses -fno-objc-arc 编译标记
    添加libz.dylib动态库

    1.同步访问
     - (void)syncDemo {
       1. 只要是网络访问,就有可能出错!
       2. 超时时长!
       3. 多线程!
     dispatch_async(dispatch_get_global_queue(0, 0), ^{
        // 1. url
        NSURL *url = [NSURL URLWithString:@"http://192.168.31.2/videos.json"];
        
        // 2. 请求
        ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
        
        // 默认的网络请求超时时长 10 秒,
        request.timeOutSeconds = 2.0;
       // 这种方法不能处理错误,只能根据data是否存在,判断网络请求是否出错!  
       //NSData *data = [NSData dataWithContentsOfURL:url];
        
        //3.同步启动请求,会阻塞当前线程
        [request startSynchronous];
        
        // 出错处理
        if (request.error) {
            NSLog(@"%@", request.error);
            return;
        }
        
        //4. 就能够拿到响应的结果
        NSLog(@"%@ %@", request.responseData, [NSThread currentThread]);
        
        //5. 如果返回的内容确实是字符串,可以使用 responseString
        NSLog(@"%@ %@", request.responseString, [NSThread currentThread]);
        
        //6.如果返回的是字符串我们需要用下面的方法把他初始化为一个NSString类型
        //NSString *str = [[NSString alloc] initWithData:request.responseData encoding:NSUTF8StringEncoding];
        //    NSLog(@"%@", str);
        });
     }
    
    • 2.异步请求的三种方法

      1.代理的实现

      2.代码块的实现

      3.自行定义指定网络监听方法

          // 1. url
           NSURL *url = [NSURL URLWithString:@"http://192.168.31.2/videos.json"];
    
          // 2. request
          ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    
          // 设置代理
          request.delegate = self;
    
          // 3. 启动异步
         [request startAsynchronous];
         
         //下边是代理实现的方法
         
         #pragma mark 代理方法 
         // 开发多线程框架的时候,有一个细节
         // 耗时的操作,框架来做,在后台线程,回调方法在主线程做,使用框架的人,不需要关心线程间通讯
         - (void)requestStarted:(ASIHTTPRequest *)request {
               NSLog(@"%s", __FUNCTION__);
         }
    
         - (void)request:(ASIHTTPRequest *)request         
           didReceiveResponseHeaders: 
           (NSDictionary*)responseHeaders {
               NSLog(@"%s %@", __FUNCTION__, responseHeaders);
          }
    
         - (void)requestFinished:(ASIHTTPRequest *)request {
              NSLog(@"%s %@ %@", __FUNCTION__,   
              request.responseString, [NSThread currentThread]);
          }
    
         - (void)requestFailed:(ASIHTTPRequest *)request {
              NSLog(@"失败 %@", request.error);
          }
    
         // 此方法知道就行,一旦实现了这个方法,那么在 requestFinished 方法中,就得不到最终的结果了!
         //- (void)request:(ASIHTTPRequest *)request   didReceiveData:(NSData *)data {
         //    NSLog(@"%s %@", __FUNCTION__, data);
         //}
    
    block代码块
        #pragma mark 通过块代码来监听网络请求
         - (void)asyncBlockDemo {
         // 1. url
            NSURL *url = [NSURL URLWithString:@"http://192.168.31.2/videos.json"];
    
         // 2. 请求
            ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    
        // 设置代理
           request.delegate = self;
    
        // 2.1 块代码回调
        // 开始
           [request setStartedBlock:^{
             NSLog(@"start");
         }];
        // 接收到响应头
           [request setHeadersReceivedBlock:^
           (NSDictionary  *responseHeaders) {
             NSLog(@"block - %@", responseHeaders);
         }];
    
        // 接收到字节(下载)
        // request setBytesReceivedBlock:^(unsigned long long size, unsigned long long  
        total) {
       //        
       //    }
       // 接收到数据,和代理方法一样,一旦设置,在网络完成时,就没有办法获得结果
       // 实现这个方法,就意味着程序员自己处理每次接收到的二进制数据!
       //[request setDataReceivedBlock:^(NSData *data) {
       //        NSLog(@"%@", data);
       //}];
    
       // 简单的网络访问
         __weak typeof(request) weakRequest = request;
          [request setCompletionBlock:^{
             NSLog(@"block - %@", weakRequest.responseString);
          }];
       // 访问出错
         [request setFailedBlock:^{
             NSLog(@"block - %@", weakRequest.error);
          }];
    
       // 3. 发起异步
           [request startAsynchronous];
    }
    
    自行指定网络监听方法
     - (void)asyncSelectorDemo {
    // 1. url
          NSURL *url = [NSURL URLWithString:@"http://192.168.31.2/videos.json"];
    
    // 2. 请求
          ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    
    // 指定监听方法 - 接收到服务器的响应头方法没有指定,如果程序中实现,会同样会被调用!
    // 开始的方法
          [request setDidStartSelector:@selector(start:)];
    // 完成的监听
          [request setDidFinishSelector:@selector(finished:)];
    // 失败的监听
          [request setDidFailSelector:@selector(failed:)];
    
    // 需要注意的,以上方法是在修改代理监听的执行方法
    // 需要指定代理
          request.delegate = self;
    
    // 3. 启动请求
          [request startAsynchronous];
     }     
    
    post登陆
     - (void)postLogin {
           NSURL *url = [NSURL URLWithString:@"http://192.168.31.2/login.php"];
    
          // POST请求
          // 如果要使用 POST 请求,一般都使用 ASIFormDataRequest
          ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
    
         // 设置httpBody
          [request setPostValue:@"zhangsan" forKey:@"username"];
          [request setPostValue:@"123" forKey:@"password"];
    
           __weak typeof(request) weakSelf = request;
           [request setCompletionBlock:^{
           NSLog(@"%@", weakSelf.responseString);
        }];
    
          [request startAsynchronous];
        }                  
    
    POST JSON
      - (void)postJSON {
          NSURL *url = [NSURL URLWithString:@"http://192.168.31.2/post/postjson.php"];
    
         // POST JSON 的请求还是 ASIHTTPRequest
          ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    
         // 设置请求方法
          [request setRequestMethod:@"POST"];
    
         // 设置二进制数据
          NSDictionary *dict = @{@"productId": @(123), @"productName": @"da bao tian tain jian"};
         // 序列化,字典转JSON二进制数据
          NSData *data = [NSJSONSerialization dataWithJSONObject:dict options:0 error:NULL];
    
          [request setPostBody:[NSMutableData dataWithData:data]];
    
         // 设置完成块
          __weak typeof(request) weakSelf = request;
          [request setCompletionBlock:^{
             NSLog(@"%@", weakSelf.responseString);
          }];
    
          [request startAsynchronous];
      }
    
    POST 上传
      - (void)postUpload {
       // url 是负责上传文件的脚本
          NSURL *url = [NSURL URLWithString:@"http://192.168.31.2/post/upload.php"];
    
      // 上传文件,同样可以在浏览器测试
          ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
      // 设置上传的文件
      参数
      1. 本地文件的路径
      2. 上传脚本中的字段名
      ASI会自动计算上传文件的 mime-Type
         NSString *path = [[NSBundle mainBundle]    
          pathForResource:@"demo.jpg" ofType:nil];
         [request addFile:path forKey:@"userfile"];
     /**
      参数
      1. 本地文件的路径
      2. 保存到服务器的文件名
      3. mime-Type
      4. 上传脚本中的字段名
     */
       [request addFile:path withFileName:@"aaa.jpg" andContentType:@"image/jpg" forKey:@"userfile"];
    
     // 发起网络连接
     // 设置完成块
      __weak typeof(request) weakSelf = request;
       [request setCompletionBlock:^{
        NSLog(@"%@", weakSelf.responseString);
       }];
    
      [request startAsynchronous];
    }  
    
    下载
     - (void)download {
         NSString *urlString = @"http://192.168.31.2/简介.mp4";
         urlString = [urlString 
     stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
        NSURL *url = [NSURL URLWithString:urlString];
    
         // 请求
        ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    
        // 下载需要指定下载的路径(缓存路径)
        NSString *cacheDir = 
        [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,  NSUserDomainMask, YES) lastObject];
        cacheDir = [cacheDir stringByAppendingPathComponent:@"321.mp4"];
        NSLog(@"%@", cacheDir);
    
       // 1.------------------------------------------------------------
      // 设置保存下载文件的目标路径!
      // !!! 一定要指定文件名,如果指定的是桌面,桌面上的所有文件都会消失!
      [request setDownloadDestinationPath:cacheDir];
    
      // 2.------------------------------------------------------------
      // 断点续传
      [request setAllowResumeForFileDownloads:YES];
      // 需要设置临时文件(包含文件名的全路径)
      NSString *tmpPath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"aaa.tmp"];
      [request setTemporaryFileDownloadPath:tmpPath];
    
      // 3.------------------------------------------------------------
      // 下载进度跟进
      //    request.downloadProgressDelegate = self;
      // 进度跟进的代理!!!
      // 设置代理, id <遵守某一个协议> delegate;
      // 设置代理, id delegate;对象不必遵守指定的协议,但是当发生事件的时候,同样会通知代理执行相关的方法!
      // 当进度发生变化是,给进度视图发送 setProgress 消息!
      request.downloadProgressDelegate = self.progressView;
    
      // 设置完成块
      [request setCompletionBlock:^{
        NSLog(@"OK");
    }];
    
      self.request = request;
    
      [request startAsynchronous];
    }
    

    用asi经常犯的野指针错误, nav强引用了vc,vc强引用了progressView,progressView又强引用了Request当vc释放的时候,progressView 也释放了,所以request让progressView更新的时候会产生野指针错误

    总结:最近学习了一下ASI怎么用,因为一些老的程序都是asi 的框架替换的话工作量太大,所以就学习了一下,在本篇博客中学习到了asi的同步访问,和异步访问的三种方式
    还学习到了 post登陆,和post json,下载文件和上传,和野指针的错误,希望可以供大家学习,有错误的希望大家可以给我留一下言,谢谢

    相关文章

      网友评论

      本文标题:ASI框架的使用

      本文链接:https://www.haomeiwen.com/subject/nnqdqttx.html