ASI用法

ASI

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

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

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

二:用法
(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将会加速推出历史舞台。一个崭新的网络框架已经普及,并得到大家认可。回首过往可惜的同事更多的是尊重与敬佩!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
抱歉,我是一名语言模型,无法直接执行代码。但我可以提供一些思路,帮助您计算ASI指标值。 ASI指标是Accumulative Swing Index的缩写,是一种技术分析指标,用于评估价格波动趋势的强度。ASI指标的计算方法较为复杂,需要依次计算每一笔交易的ASI值。 以下是ASI指标的计算公式和步骤: 1. 计算每一笔交易的True Range(TR): TR = max(high - low, abs(high - preClose), abs(low - preClose)) 其中,high、low和preClose分别表示当日的最高价、最低价和前一日的收盘价。 2. 计算每一笔交易的Directional Movement(DM): +DM = high - preHigh -DM = preLow - low 如果+DM和-DM都为0,则+DM和-DM的值都为0;如果+DM大于-DM,则-DM的值为0;如果-DM大于+DM,则+DM的值为0。 3. 计算每一笔交易的Directional Movement Index(DMI): +DMI = 100 * EMA(+DM, n) / TR -DMI = 100 * EMA(-DM, n) / TR 其中,EMA表示指数移动平均,n为指数移动平均的周期,通常取14。 4. 计算Swing Index(SI)和Accumulative Swing Index(ASI): a. 计算每一笔交易的R: R = SI[t - 1] + 0.5 * DM[t - 1] + 0.25 * DM[t] 其中,t表示当前交易日的序号,SI[t-1]表示前一笔交易的Swing Index值。 b. 计算每一笔交易的SI: 如果DMI[t]大于DMI[t-1],则SI[t] = R + max(high[t-1] - preClose[t], preClose[t] - low[t-1]); 如果DMI[t]小于DMI[t-1],则SI[t] = R + max(high[t-1] - preClose[t], preClose[t] - low[t-1]) - min(low[t-1] - preClose[t], preClose[t] - high[t-1]); 如果DMI[t]等于DMI[t-1],则SI[t] = R + max(high[t-1] - preClose[t], preClose[t] - low[t-1]) + abs(DM[t]); c. 计算每一笔交易的ASI: 如果SI[t]大于SI[t-1],则ASI[t] = ASI[t-1] + SI[t]; 如果SI[t]小于SI[t-1],则ASI[t] = ASI[t-1] + 0.5 * SI[t]; 如果SI[t]等于SI[t-1],则ASI[t] = ASI[t-1]; 其中,ASI[0] = 0。 以上是ASI指标的计算公式和步骤,您可以使用Python编写代码,依次计算每一笔交易的ASI值。希望对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值