ASI用法

ASI

看到某某银行的客户端网络请求还是比较老的框架ASI、并且还是手动管理内存(非ARC),现在基本上网络请求用的都是AFN,所以对ASI已经很久没碰了,现在要重新整理把以前的东东都捡起来,方便以后如果再次遇到这种情况能够很快上手(祈祷在也碰不到了)

一:概念:全称是ASIHTTPRequest,江湖人称“HTTP终结者”,底层基于C的CFNetwork框架,运行效率很高功能十分强大,只可惜作者很早已不更新,所以一些潜在的bug无人去解决。这么好用的东西不更新,确实可惜。

github地址
https://github.com/pokeb/asi-http-request

二:用法
(1)把所需要的文件导入工程,并添加依赖库:

ASI用法_第1张图片

(2)监听请求

a.第一种block的形式

    // 1.URL
    NSURL *url = [NSURL URLWithString:@"http://xxxxxxxxxxx"];

    // 2.创建一个请求对象
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

     //超时时间  
     request.timeOutSeconds = 30;

    // 3.开始请求
    [request startAsynchronous];

    // 4.设置block监听
    [request setStartedBlock:^{
        NSLog(@"开始请求的时候调用");
    }];
    [request setCompletionBlock:^{
        NSLog(@"请求完成的时候调用");
    }];
    [request setFailedBlock:^{
        NSLog(@"请求失败的时候调用");
    }];

//不要忘记在控制器销毁的时候要取消请求(这个很重要,要不然很容易报野指针错误问题)
-(void)dealloc
{
    [self.request clearDelegatesAndCancel];
}

b.第二种:设置代理,不需要遵守ASIHTTPRequestDelegate协议,自定义代理方法

   // 1.URL
    NSURL *url = [NSURL    URLWithString:@"http://xxxxxxxxxx"];

    // 2.创建一个请求对象
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    //超时时间  
     request.timeOutSeconds = 30;
    // 3.开始请求
    [request startAsynchronous];
    // 4.设置监听方法
    request.delegate = self;
    //请求开始的时候就会调用代理的start方法
    [request setDidStartSelector:@selector(start:)];
   //请求完成的时候就会调用代理的finish方法
    [request setDidFinishSelector:@selector(finish:)];

c.第三种:就比较麻烦了,也是调用代理的方法,个人不建议用。前面两种就已经够了,不需要太在意。

 - (void)requestStarted:(ASIHTTPRequest *)request;
 - (void)request:(ASIHTTPRequest *)request didReceiveResponseHeaders:(NSDictionary *)responseHeaders;
 - (void)request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data;
 - (void)requestFinished:(ASIHTTPRequest *)request;
 - (void)requestFailed:(ASIHTTPRequest *)request;

d.发送post请求
导入#import “ASIFormDataRequest.h”文件
ASIFormDataRequest的作用就是发送post请求

// 1.URL
    NSURL *url = [NSURL URLWithString:@"http://xxxxxxxxxx"];

    // 2.创建一个请求对象
    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
    request.timeOutSeconds = 30;

    // 3.设置请求参数
    [request setPostValue:@"lifufa" forKey:@"username"];

    [request setPostValue:@"lifufa" forKey:@"pwd"];

    // 4.开始请求
    [request startAsynchronous];

    // 5.设置监听方法
    __weak typeof(request) weakRequest = request;
    [request setCompletionBlock:^{
        NSLog(@"请求完毕--%@", [weakRequest responseString]);
    }];
[request setFailedBlock:^{
         NSLog(@"请求失败--%@", [weakRequest responseString]);

    }];


三:一些在开发中可能用到的方法


(1)设置请求超时后重试的次数

request.numberOfTimesToRetryOnTimeout = 3; // 重试3次2)当应用后台运行时,是否仍然继续处理网络请求

request.shouldContinueWhenAppEntersBackground = YES;

(3)当正在请求时,是否要在状态栏显示联网状态(转圈圈)

[ASIHTTPRequest setShouldUpdateNetworkActivityIndicator:YES];



四:文件下载


 // 1.URL
        NSURL *url = [NSURL URLWithString:@"http://xxxxxxxxxxx"];

        // 2.创建一个请求对象
        ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

        // 3.设置文件的缓存路径
        NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
        NSString *filepath = [caches stringByAppendingPathComponent:@"test1.mp4"];
        request.downloadDestinationPath = filepath;

        // 4.设置进度监听的代理(要想成为进度监听代理,最好遵守ASIProgressDelegate协议)
        request.downloadProgressDelegate = self;

        // 这个属性设置为YES,就会支持断点下载
        request.allowResumeForFileDownloads = YES;

        // 如果要实现断点续传,需要设置一个文件的临时路径,NSTemporaryDirectory()代表temp路径
        request.temporaryFileDownloadPath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"test.temp"];

        // 5.开始请求
        [request startAsynchronous];

五:文件上传

// 1.URL
NSURL *url = [NSURL URLWithString:@”http://xxxxxxxxxxxxxx“];

// 2.创建一个请求对象
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];

// 3.设置请求参数
[request setPostValue:@"lifufa" forKey:@"username"];
[request setPostValue:@"lifufa" forKey:@"pwd"];


// 设置文件参数
NSString *file = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"mp4"];
// 如果知道文件路径,最好就用这个方法(因为简单)
// ASI内部会自动识别文件的MIMEType
[request setFile:file forKey:@"file"];


// 如果文件数据是动态产生的,就用这个方法.

// [request setData:<#(id)#> withFileName:<#(NSString )#> andContentType:<#(NSString )#> forKey:<#(NSString *)#>];

// 4.可以设置监听上传进度的代理
request.uploadProgressDelegate = self;

// 5.开始请求
[request startAsynchronous];

// 6.监听完毕
__weak typeof(request) weakRequest = request;
[request setCompletionBlock:^{
    NSLog(@"%@", [weakRequest responseString]);
}];

“`

了解以上这些应该就能解决老的项目请求问题,这个框架确实很牛逼。比起AFN来说,如果作者能够更新,本人还是更喜欢ASI.随着swift的普及,ASI将会加速推出历史舞台。一个崭新的网络框架已经普及,并得到大家认可。回首过往可惜的同事更多的是尊重与敬佩!

你可能感兴趣的:(技术类,ASI,网络)