• IOS-网络(ASI使用)


    ASI与AFN区别

    区别:

    1.底层实现

    1>AFN的底层基于OC的NSURLConnection与NSURLSession

    2>ASI的底层基于纯C语言的CFNetWork框架

    3>ASI运行性能高于AFN

    2.对服务器返回的数据处理

    1>ASI没有直接提供对服务器数据的处理方式,直接放回datastring

    2>AFN提供多种对服务器的数据处理方式(JSON、XML、其他)

    3.监听请求过程

    1>ASI提供了3套方案,每套方法都能监听请求的完整过程

    a.成为代理,遵守协议,实现协议方法

    b.成为代理,不遵守协议,自定义代理方法

    c.设置block

    2>AFN提供两个block监听请求过程(success、failure)

    a.success : 请求成功时调用

    b.failure : 请求失败时调用

    4.提供的功能

    5.文件上传下载难易度

    1>ASI

    a.非常容易监听下载进度和上传进度

    b.容易实现断点续传

    c.下载或大或小文件都可以

    d.非常容易实现下载和上传

    2>AFN

    a.不容易监听下载进度和上传进度

    b.不容易实现断点续传

    c.一般用来下载不大的文件

    6.ASI提供了更多的实用功能

    1>控制圈圈要不要再请求过程中转

    2>可以轻松设置请求之间的依赖:每个请求都是NSOperation对象

    3>可以统一管理所有请求(专门提供一个ASINetworkQueue来管理所有请求对象)

    4>暂停、恢复、取消所有请求

    5>监听整个队列中上传、下载进度

    一、ASI用法

      1 //
      2 //  ViewController.m
      3 //  IOS_0215_ASI
      4 //
      5 //  Created by ma c on 16/2/15.
      6 //  Copyright © 2016年 博文科技. All rights reserved.
      7 //
      8 
      9 #import "ViewController.h"
     10 #import "ASIHTTPRequest.h"
     11 
     12 @interface ViewController ()<ASIHTTPRequestDelegate>
     13 
     14 @end
     15 /*
     16  监听ASI请求:
     17  1>成为代理,遵守ASIHTTPRequestDelegate的协议,实现协议中的代理方法
     18  2>成为代理,不遵守ASIHTTPRequestDelegate的协议,自定义代理方法
     19  3>设置block
     20  */
     21 @implementation ViewController
     22 
     23 - (void)viewDidLoad {
     24     [super viewDidLoad];
     25     self.view.backgroundColor = [UIColor cyanColor];
     26 }
     27 
     28 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
     29 {
     30     [self asynCustomMethod];
     31 }
     32 
     33 #pragma mark - 其他用法
     34 
     35 #pragma mark - 自定义方法
     36 - (void)asynCustomMethod
     37 {
     38     // 1.URL
     39     NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/video"];
     40     
     41     // 2.创建一个请求
     42     ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
     43     request.timeOutSeconds = 15;
     44     
     45     // 3.设置请求
     46     [request startAsynchronous];
     47     
     48     //设置监听方法
     49     request.delegate = self;
     50     [request setDidStartSelector:@selector(start:)];
     51     [request setDidFinishSelector:@selector(finish:)];
     52     
     53 }
     54 
     55 - (void)start:(ASIHTTPRequest *)request
     56 {
     57     NSLog(@"start------%@",request);
     58 }
     59 
     60 - (void)finish:(ASIHTTPRequest *)request
     61 {
     62     NSLog(@"finish------%@",[request responseString]);
     63 }
     64 
     65 #pragma mark - block方法
     66 - (void)asynBlock
     67 {
     68     /*
     69      如果同时设置了block和实现了代理方法,请求过程中block和代理方法都会调用
     70      调用顺序:代理方法 > block
     71      */
     72     
     73     // 1.URL
     74     NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/video"];
     75     
     76     // 2.创建一个请求
     77     ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
     78     request.timeOutSeconds = 15;
     79     
     80     // 3.开始请求
     81     [request startAsynchronous];
     82     
     83     // 4.设置block监听
     84     [request setStartedBlock:^{
     85         NSLog(@"setStartedBlock");
     86     }];
     87     [request setHeadersReceivedBlock:^(NSDictionary *responseHeaders) {
     88         NSLog(@"setHeadersReceivedBlock");
     89     }];
     90     [request setDataReceivedBlock:^(NSData *data) {
     91         NSLog(@"setDataReceivedBlock---%@",data);
     92     }];
     93     [request setCompletionBlock:^{
     94         NSLog(@"setCompletionBlock");
     95     }];
     96     [request setFailedBlock:^{
     97         NSLog(@"setFailedBlock");
     98     }];
     99 }
    100 #pragma mark - 基本用法
    101 
    102 #pragma mark - 异步请求
    103 /*
    104 ///异步
    105 - (void)asynGet
    106 {
    107     // 1.URL
    108     NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/video"];
    109     
    110     // 2.创建一个请求
    111     ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    112     request.timeOutSeconds = 15;
    113     
    114     // 3.设置代理
    115     request.delegate = self;
    116     
    117     // 4.开始请求
    118     [request startAsynchronous];
    119 }
    120 #pragma mark - ASIHTTPRequestDelegate代理方法
    121 
    122 //1.开始发送请求
    123 - (void)requestStarted:(ASIHTTPRequest *)request
    124 {
    125     NSLog(@"requestStarted");
    126 }
    127 
    128 //2.接收到服务器的响应头信息
    129 - (void)request:(ASIHTTPRequest *)request didReceiveResponseHeaders:(NSDictionary *)responseHeaders
    130 {
    131     NSLog(@"didReceiveResponseHeaders");
    132 }
    133 
    134 //3.接收到服务器的实体数据(具体数据)
    135 //只要实现了这个代理方法,responseData
    esponseString就没有值 - 建议不要使用这个方法
    136 - (void)request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data
    137 {
    138     NSLog(@"didReceiveData----%@",data);
    139 }
    140 
    141 //4.服务器的相应数据 接收完毕
    142 - (void)requestFinished:(ASIHTTPRequest *)request
    143 {
    144     NSLog(@"requestFinished---%@",[request responseData]);
    145 }
    146 
    147 //5.请求失败
    148 - (void)requestFailed:(ASIHTTPRequest *)request
    149 {
    150     NSLog(@"requestFailed");
    151 }
    152  */
    153 
    154 #pragma mark - 同步请求
    155 - (void)synGet
    156 {
    157     // 1.URL
    158     NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/video"];
    159     
    160     // 2.创建一个请求
    161     ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    162     request.timeOutSeconds = 15;
    163     
    164     // 3.开始请求(这段代码会卡住,等待服务器给数据)
    165     [request startSynchronous];
    166     
    167     //4.请求完毕
    168     NSError *error = [request error];
    169     if (error) {
    170         NSLog(@"请求失败---%@",error);
    171     } else {
    172         
    173         //NSData *data = [request responseData];
    174         //NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    175         NSString *str = [request responseString];
    176         
    177         NSLog(@"请求成功---%@",str);
    178     }
    179 }
    180 
    181 @end

    二、文件下载与上传

      1 //
      2 //  ViewController.m
      3 //  IOS_0215_ASI
      4 //
      5 //  Created by ma c on 16/2/15.
      6 //  Copyright © 2016年 博文科技. All rights reserved.
      7 //
      8 
      9 #import "ViewController.h"
     10 #import "ASIHTTPRequest.h"
     11 
     12 //使用ASIFormDataRequest,默认发送POST请求
     13 #import "ASIFormDataRequest.h"
     14 
     15 @interface ViewController ()<ASIProgressDelegate>
     16 
     17 @property (nonatomic, strong) ASIFormDataRequest *request;
     18 
     19 
     20 @end
     21 
     22 @implementation ViewController
     23 
     24 - (void)viewDidLoad {
     25     [super viewDidLoad];
     26     self.view.backgroundColor = [UIColor cyanColor];
     27 }
     28 
     29 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
     30 {
     31 //    [self asynPOST];
     32 //    [self download];
     33     [self upload];
     34 }
     35 #pragma mark - 文件上传
     36 - (void)upload
     37 {
     38     // 1.URL
     39     NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/upload"];
     40     
     41     // 2.创建一个请求
     42     ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
     43     
     44     // 3.设置请求参数
     45     [request setPostValue:@"123" forKey:@"username"];
     46     [request setPostValue:@"123" forKey:@"pwd"];
     47     
     48     // 4.设置文件参数
     49     //如果知道文件路径最好用这个-AST内部会自动识别MIMEType
     50     NSString *filePath = [[NSBundle mainBundle] pathForResource:@"MIMEType" ofType:@"png"];
     51     [request setFile:filePath forKey:@"file"];
     52     
     53     //如果文件数据是动态产生的,就用这个方法(拍照上传)
     54     //[request setData:<#(NSData *)#> forKey:<#(NSString *)#>];
     55     
     56     // 4.设置上传进度代理
     57     request.uploadProgressDelegate = self;
     58  
     59     // 5.设置请求
     60     [request startAsynchronous];
     61     
     62     // 6.监听完毕
     63     __weak typeof(request) weakRequest = request;
     64     [request setCompletionBlock:^{
     65         
     66         NSLog(@"setCompletionBlock-----%@",[weakRequest responseString]);
     67     }];
     68     
     69     self.request = request;
     70 }
     71 
     72 - (void)dealloc
     73 {
     74     //此句代码为了防止:控制器销毁了,request还回来调用控制器的代理方法,引发野指针错误
     75     [self.request clearDelegatesAndCancel];
     76 }
     77 
     78 #pragma mark - 文件下载
     79 - (void)download
     80 {
     81     // 1.URL
     82     NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/resources/videos/minion_01.mp4"];
     83     
     84     // 2.创建一个请求
     85     ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
     86     request.timeOutSeconds = 15;
     87     
     88     // 3.设置文件缓存路径
     89     NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
     90     NSString *filePath = [caches stringByAppendingPathComponent:@"test.mp4"];
     91     request.downloadDestinationPath = filePath;
     92     
     93     // 4.设置进度监听的代理(要想成为进度监听代理,最好实现ASIProgressDelegate的协议)
     94     request.downloadProgressDelegate = self;
     95     
     96     // 4.这个属性设置为YES,就会支持断点下载
     97     request.allowResumeForFileDownloads = YES;
     98     // 4.如果要实现断点下载需要设置文件的临时路径
     99     request.temporaryFileDownloadPath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"test.temp"];
    100     
    101     // 4.设置请求
    102     [request startAsynchronous];
    103 }
    104 
    105 - (void)setProgress:(float)newProgress
    106 {
    107     NSLog(@"setProgress----%lf",newProgress);
    108 }
    109 
    110 
    111 #pragma mark - POST请求
    112 ///POST请求
    113 - (void)asynPOST
    114 {
    115     // 1.URL
    116     NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/login"];
    117     
    118     // 2.创建一个请求
    119     ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
    120     request.timeOutSeconds = 15;
    121     
    122     // 3.设置请求参数(建议使用setPostValue)
    123     [request setPostValue:@"123" forKey:@"username"];
    124     [request setPostValue:@"123" forKey:@"pwd"];
    125     
    126     // 4.设置请求
    127     [request startAsynchronous];
    128     
    129     //设置block
    130     __weak typeof(request) weakRequest = request;
    131     
    132     [request setCompletionBlock:^{
    133         
    134         NSLog(@"setCompletionBlock-----%@",[weakRequest responseString]);
    135     }];
    136 }
    137 @end

     

  • 相关阅读:
    ElasticSearch 清理索引
    Docker 服务接入SkyWalking
    Promethues mysql_exporter 集中式监控
    修改SVN密码自助平台
    快速排序(golang)
    ElasticSearch Xpack集群认证和elasticsearch-head配置
    Ansible一个tasks失败则终止剩余的task
    Consul安装
    最纯净的开发者技术交流社群
    Flutter中的报错:(IOS pod 版本错误) error: compiling for iOS 8.0, but module 'xxx' has a minimum deployment target of iOS 9.0
  • 原文地址:https://www.cnblogs.com/oc-bowen/p/5191571.html
Copyright © 2020-2023  润新知