ASI框架的使用

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,下载文件和上传,和野指针的错误,希望可以供大家学习,有错误的希望大家可以给我留一下言,谢谢

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271

推荐阅读更多精彩内容