网络ASI

Posted IOSyes

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络ASI相关的知识,希望对你有一定的参考价值。

ASIHTTPRequest  基于底层CFNetwork框架,运行效率很高

可惜作者 停止更新,有一些潜在的BUG无人去解决

老项目 ASI + SBJson

只需要用到外面的源文件

ASI还依赖于Reachability 用来检测网络状态

ASI的基本使用

非ARC

1.

#import "HMViewController.h"
#import "ASIHTTPRequest.h"

@interface HMViewController () <ASIHTTPRequestDelegate>
@property (nonatomic, strong) ASIHTTPRequest *request;
@end

@implementation HMViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self asynGet];
}

/**
 *  异步的GET请求
 */
- (void)asynGet
{
    // 1.URL
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/video?type=JSON"];
    
    // 2.创建一个请求对象
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    request.timeOutSeconds = 15; // 15秒后服务器还没有响应,就算超时
    // 设置代理
    request.delegate = self;
    
    // 3.开始请求
    [request startAsynchronous];
    
    self.request = request;
}

- (void)dealloc
{
    // 这句代码为了防止:控制器销毁了,request还回来调用控制器的代理方法,引发野指针
    [self.request clearDelegatesAndCancel];
}

#pragma mark - ASIHTTPRequestDelegate
/**
 *  1.开始发送请求
 */
- (void)requestStarted:(ASIHTTPRequest *)request
{
    NSLog(@"requestStarted");
}
/**
 *  2.接收到服务器的响应头信息
 */
- (void)request:(ASIHTTPRequest *)request didReceiveResponseHeaders:(NSDictionary *)responseHeaders
{
    NSLog(@"didReceiveResponseHeaders");
}
/**
 *  3.接收到服务器的实体数据(具体数据)
 *  只要实现了这个代理方法,responseData\\responseString就没有值
 */
//- (void)request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data
//{
//    NSLog(@"didReceiveData-%@", data);
//}
/**
 *  4.服务器的响应数据接收完毕
 */
- (void)requestFinished:(ASIHTTPRequest *)request
{
    NSLog(@"requestFinished--%@", [request responseData]);
}
/**
 *  5.请求失败
 */
- (void)requestFailed:(ASIHTTPRequest *)request
{
    NSLog(@"requestFailed");
}


/**
 *  同步的GET请求
 */
- (void)synGet
{
    // 1.URL
    NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/video"];
    
    // 2.创建一个请求对象
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    request.timeOutSeconds = 15; // 15秒后服务器还没有响应,就算超时
    
    // 3.开始请求(这行代码会卡主,等待服务器给数据)
    [request startSynchronous];
    
    // 4.请求完毕
    NSError *error = [request error];
    if (error) {
        NSLog(@"请求失败---%@", error);
    } else {
        NSData *data = [request responseData];
        //        NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        //        NSString *str = [request responseString];
        
        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
        NSLog(@"请求成功---%@", dict);
} }

  

建议

除了做文件下载 要监听进度

只要实现了 代理方法中的  didReceiveData  requestFinished中request没有值

如果没有实现didReceiveData,requestFinshed中request有值

 

以上是关于网络ASI的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发网络篇—简单介绍ASI框架的使用

ASI进行POST网络请求

iOS核心笔记——网络编程-ASI与AFN的区别

VSCode自定义代码片段14——Vue的axios网络请求封装

VSCode自定义代码片段14——Vue的axios网络请求封装

VSCode自定义代码片段14——Vue的axios网络请求封装