AFN使用

不使用第三方框架如何实现文件上传?
使用NSURLConnection无法通过HTML表单来上传图片,因此想要上传图片,必须实现HTTP请求,而不能像其他语言那样通过HTML表单的POST就能上传
不使用第三方框架如何实现断点续传?
要使用NSURLConnection实现断点续传
需要自定义URLRequest的头部的Range属性,通知URLConnection只是去获取部分网络内容

Range头域示例
  Range头域可以请求实体的一个或者多个子范围。例如,
  表示头500个字节:bytes=0-499
  表示第二个500字节:bytes=500-999
  表示最后500个字节:bytes=-500
  表示500字节以后的范围:bytes=500-
  第一个和最后一个字节:bytes=0-0,-1
  同时指定几个范围:bytes=500-600,601-999
但是服务器可以忽略此请求头,如果无条件GET包含Range请求头,响应会以状态码206(PartialContent)返回而不是以200(OK)

具体使用步骤如下,
一,新建项目并导入AFN框架的步骤

  1. 将框架程序拖拽进项目
  2. 添加iOS框架引用
    SystemConfiguration.framework
    MobileCoreServices.framework
  3. 修改xxx-Prefix.pch文件

    import

    import

二、代码实例,如下,
@interface ViewController ()
{

// AFN的客户端,使用基本地址初始化,同时会实例化一个操作队列,以便于后续的多线程处理
AFHTTPClient    *_httpClient;

// 下载操作
AFHTTPRequestOperation *_downloadOperation;

NSOperationQueue *_queue;

}

  • (void)viewDidLoad
    {
    [super viewDidLoad];

    NSURL *url = [NSURL URLWithString:@“http://192.168.3.251/~apple/itcast”];
    _httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];

    _queue = [[NSOperationQueue alloc] init];
    }

//下载暂停,开始

  • (IBAction)pauseResume:(id)sender
    {
    if (_downloadOperation.isPaused) {
    [_downloadOperation resume];
    
    } else {
    [_downloadOperation pause];
    
    }
    }

pragma mark 下载

  • (IBAction)download
    {
    // 1. 建立请求
    NSURLRequest *request = [_httpClient requestWithMethod:@“GET” path:@“download/Objective-C2.0.zip” parameters:nil];

    // 2. 操作
    AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];

    _downloadOperation = op;

    // 下载
    // 指定文件保存路径,将文件保存在沙盒中
    NSArray docs = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString
    path = [docs[0] stringByAppendingPathComponent:@“download.zip”];

    op.outputStream = [NSOutputStream outputStreamToFileAtPath:path append:NO];

    // 设置下载进程块代码
    /
    bytesRead 当前一次读取的字节数(100k)
    totalBytesRead 已经下载的字节数(4.9M)
    totalBytesExpectedToRead 文件总大小(5M)
    /
    [op setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {

    // 设置进度条的百分比
    CGFloat precent = (CGFloat)totalBytesRead / totalBytesExpectedToRead;
    NSLog(@"%f", precent);
    
    _progressView.progress = precent;
    

    }];

    // 设置下载完成操作
    [op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {

    // 下载完成之后,解压缩文件
    
    NSLog(@"下载成功");
    

    } failure:^(AFHTTPRequestOperation operation, NSError error) {

    NSLog(@"下载失败");
    

    }];

    // 启动下载
    [_httpClient.operationQueue addOperation:op];
    }

pragma mark 检测网路状态

/
AFNetworkReachabilityStatusUnknown = -1, 未知
AFNetworkReachabilityStatusNotReachable = 0, 未连接
AFNetworkReachabilityStatusReachableViaWWAN = 1, 3G
AFNetworkReachabilityStatusReachableViaWiFi = 2, 无线连接
/

  • (IBAction)checkNetwork:(id)sender
    {
    // 1. AFNetwork 是根据是否能够连接到baseUrl来判断网络连接状态的
    // 提示:最好使用门户网站来判断网络连接状态。
    NSURL *url = [NSURL URLWithString:@“http://www.baidu.com”];

    AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:url];
    _httpClient = client;

    [_httpClient setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {

    // 之所以区分无线和3G主要是为了替用户省钱,省流量
    // 如果应用程序占流量很大,一定要提示用户,或者提供专门的设置,仅在无线网络时使用!
    switch (status) {
        case AFNetworkReachabilityStatusReachableViaWiFi:
            NSLog(@"无线网络");
            break;
        case AFNetworkReachabilityStatusReachableViaWWAN:
            NSLog(@"3G网络");
            break;
        case AFNetworkReachabilityStatusNotReachable:
            NSLog(@"未连接");
            break;
        case AFNetworkReachabilityStatusUnknown:
            NSLog(@"未知错误");
            break;
    }
    

    }];
    }

/**
官方建议AFN的使用方法

  1. 定义一个全局的AFHttpClient:包含有
    1> baseURL
    2> 请求
    3> 操作队列 NSOperationQueue

  2. 由AFHTTPRequestOperation负责所有的网络操作请求

    */

    pragma mark - Actions

  3. (void)loadJSON1
    {
    // 1. NSURL
    NSURL *url = [NSURL URLWithString:@““];

    // 2. NSURLRequest
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    // 3. NSURLConnection
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse response, NSData data, NSError *connectionError) {

    if (connectionError != nil) {
        NSLog(@"%@", connectionError.localizedDescription);
    } else {
        NSError *error = nil;
    
        NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];
    
        if (error != nil) {
            NSLog(@"%@", error.localizedDescription);
        } else {
            NSLog(@"%@", array);
        }
    }
    

    }];
    }

pragma mark 加载JSON

  • (IBAction)loadJSON
    {
    // 1. NSURLRequest
    NSURLRequest *request = [_httpClient requestWithMethod:@“GET” path:@“videos.php?format=json” parameters:nil];

    // 2. 连接
    AFJSONRequestOperation op = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest request, NSHTTPURLResponse response, NSArray JSON) {

    // 成功之后,直接使用反序列化出来的结果即可。
    NSLog(@"%@", JSON);
    

    } failure:^(NSURLRequest request, NSHTTPURLResponse response, NSError *error, id JSON) {

    // 1> 网络访问获取数据出错
    // 2> JSON的反序列化出错
    
    NSLog(@"%@ %@", error, JSON);
    

    }];

    // 3. 将操作添加到队列,开始多线程操作
    // 将操作添加到队列或者start,操作就会启动
    [httpClient.operationQueue addOperation:op];
    // [
    queue addOperation:op];
    // [op start];
    }

很多时候,如果不会,我们应该直接跳到AFN的头文件里去查看……
以上是最常用的AFN代码……如果不行,可以查看源文件,哦!

你可能感兴趣的:(AFN)