zoukankan      html  css  js  c++  java
  • IOS


    #import "ViewController.h"
    #import "AFNetworking.h"
    #import "SSZipArchive.h"

    @interface ViewController ()
    {
        // AFN的客户端,使用基本地址初始化,同时会实例化一个操作队列,以便于后续的多线程处理
        AFHTTPClient    *_httpClient;
        
        // 下载操作
        AFHTTPRequestOperation *_downloadOperation;
        
        NSOperationQueue *_queue;
    }

    @property (weak, nonatomic) IBOutlet UIProgressView *progressView;

    @end

    @implementation ViewController
    /*
     关于文件下载,在Documents中保存的文件,一定是要应用程序产生的文件或者数据
     没有明显提示用户下载到本地的文件不能保存在Docuemnts中!
     
     
     */

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        
        NSURL *url = [NSURL URLWithString:@"http://192.168.3.251/~apple/itcast"];
        _httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];
        
        _queue = [[NSOperationQueue alloc] init];
    }

    #pragma mark - 文件上传
    - (IBAction)uploadImage
    {
        /*
         此段代码如果需要修改,可以调整的位置
         
         1. 把upload.php改成网站开发人员告知的地址
         2. 把file改成网站开发人员告知的字段名
         */
        // 1. httpClient->url
        
        // 2. 上传请求POST
        NSURLRequest *request = [_httpClient multipartFormRequestWithMethod:@"POST" path:@"upload.php" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
            // 在此位置生成一个要上传的数据体
            // form对应的是html文件中的表单
            /*
             参数
             1. 要上传的[二进制数据]
             2. 对应网站上[upload.php中]处理文件的[字段"file"]
             3. 要保存在服务器上的[文件名]
             4. 上传文件的[mimeType]
             */
            UIImage *image = [UIImage imageNamed:@"头像1"];
            NSData *data = UIImagePNGRepresentation(image);
            
            // 在网络开发中,上传文件时,是文件不允许被覆盖,文件重名
            // 要解决此问题,
            // 可以在上传时使用当前的系统事件作为文件名
            NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
            // 设置时间格式
            formatter.dateFormat = @"yyyyMMddHHmmss";
            NSString *str = [formatter stringFromDate:[NSDate date]];
            NSString *fileName = [NSString stringWithFormat:@"%@.png", str];
            
            [formData appendPartWithFileData:data name:@"file" fileName:fileName mimeType:@"image/png"];
        }];
        
        // 3. operation包装的urlconnetion
        AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];
        
        [op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
            NSLog(@"上传完成");
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            NSLog(@"上传失败->%@", error);
        }];
        
        [_httpClient.operationQueue addOperation:op];
    }

    - (IBAction)pauseResume:(id)sender
    {
        // 关于暂停和继续,AFN中的数据不是线程安全的
        // 如果使用操作的暂停和继续,会使得数据发生混乱
        // 不建议使用此功能。
        // 有关暂停和后台下载的功能,NSURLSession中会介绍。
        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) {
            
            // 下载完成之后,解压缩文件
            /*
             参数1:要解结压缩的文件名及路径 path - > download.zip
             参数2:要解压缩到的位置,目录    - > document目录
             */
            [SSZipArchive unzipFileAtPath:path toDestination:docs[0]];
            
            // 解压缩之后,将原始的压缩包删除
            // NSFileManager专门用于文件管理操作,可以删除,复制,移动文件等操作
            // 也可以检查文件是否存在
            [[NSFileManager defaultManager] removeItemAtPath:path error:nil];
            
            // 下一步可以进行进一步处理,或者发送通知给用户。
            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
    - (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];
    }

    - (IBAction)loadXML:(id)sender
    {
    }

  • 相关阅读:
    svn鉴权方法
    我收藏的技术网站
    linux下apache+svn的安装
    svn安装失败解决方法
    编译器扩展deprecated
    svn静态库依赖关系
    Linux用户和组
    boost之简介、编译、安装和使用
    svn数据库认证方法
    svn版本库目录结构
  • 原文地址:https://www.cnblogs.com/mcj-coding/p/3581527.html
Copyright © 2011-2022 走看看