day4---开源库AFNetWorking

一 AFNetWorking
目前非常受欢迎的网络开源库,它拥有良好的架构,丰富的API,以及模块化的构建方式,使用起来非常简洁轻松;
AFNetWorking新版本不仅封装了NSURLConnection,还封装了NSURLSession等相关功能,可以让程序员简单的操作就可以轻松的实现GET/POST请求数据,下载文件,上传文件/上传图片,检测网络状态等相关功能,还非常贴心的帮助程序员直接处理一些JSON/XML格式的解析;

1.1 检测网络状态和GET请求,POST,文件下载
    【Demo】-【1-AFNetWorking_GET】

//检测是否有网络,有什么网络?

  • (IBAction)netinfo:(id)sender {
    //1.获取网络监控的管理者
    AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];

    //2.设置网络方式变化时的代码
    [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {

      switch (status) {
          case AFNetworkReachabilityStatusUnknown:
              NSLog(@"未知网络");
              break;
              
          case AFNetworkReachabilityStatusNotReachable:
              NSLog(@"无网络");
              break;
              
          case AFNetworkReachabilityStatusReachableViaWiFi:
              NSLog(@"WIFI");
              break;
              
          case AFNetworkReachabilityStatusReachableViaWWAN:
              NSLog(@"手机自己的网络(3G/4G)");
              break;
              
          default:
              break;
      }
    

    }];

    //3.启动监控
    [manager startMonitoring];

//4.判断是什么网络?(返回的是bool值)
[manager isReachableViaWiFi];//WIFI
[manager isReachableViaWWAN];//蜂窝网络
[manager isReachable];//YES 有网    NO没有网络

}
//get请求数据

  • (IBAction)getRequestData:(id)sender {

    //1.获得请求对象
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    //2.设置返回的数据格式
    //直接返回的是NSData类型 [AFHTTPResponseSerializer serializer]
    //返回的是JSON格式 [AFJSONResponseSerializer serializer];
    //返回的是XML格式 [AFXMLParserResponseSerializer serializer];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];

    //3.发起GET请求
    [manager GET:@"http://mapi.damai.cn/proj/HotProj.aspx?CityId=0&source=10099&version=30602" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {

      //请求成功
      NSLog(@"请求成功");
      NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
      NSLog(@"%@",dict);
    

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

      NSLog(@"请求失败");
    

    }];

}
//POST请求

  • (IBAction)postRequestData:(id)sender {

    NSString *urlStr = @"http://10.0.8.8/sns/my/user_list.php";
    //拼接请求体的内容【这里拼接成字典,数组,字符串】
    NSDictionary *bodyDict = @{@"page":@2,@"number":@10};
    NSArray *bodyArr = @[@"page",@3,@"number",@10];
    NSString *bodyStr = @"page=2,number=10";

    //1.创建网络请求对象
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

    //2.设置响应格式
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];

    //3.POST请求
    [manager POST:urlStr parameters:bodyDict success:^(AFHTTPRequestOperation *operation, id responseObject) {

      NSLog(@"请求成功");
      NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
      NSLog(@"%@",dict);
    

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"请求失败");
    }];

}

//文件下载

  • (IBAction)downLoadFile:(id)sender {

    NSString *urlStr = @"http://10.6.154.91/share/音乐/好难得.mp3";
    urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    //1.构造NSURL
    NSURL *url = [NSURL URLWithString:urlStr];

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

    //3.创建AFURLSessionManager对象
    AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];

    //4.创建任务
    NSURLSessionDownloadTask *task = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {

      //下载成功后,返回最终将要把tmp文件保存的文件存储到哪个目录所对应的路径
      NSString *toPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/好难得.mp3"];
      NSLog(@"%@",toPath);
      NSURL *url = [NSURL fileURLWithPath:toPath];
      return url;
    

    } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
    //不管成功,还是失败都会调用该代码块
    //filePath代表的是下载的文件所在的路径
    //error错误信息,如果为NULL,表示下载成功
    NSLog(@"下载失败:%@",error);

    }];

    //5.启动任务
    [task resume];
    }

  • (void)viewDidLoad {
    [super viewDidLoad];

    [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;

}

1.2 进度条监听文件下载的进度
    【Demo】-【2-AFNetWorking_progress】
  • (IBAction)downLoadFile:(id)sender {

    NSString *urlStr = @"http://10.6.154.91/share/视频/1.mp4";
    urlStr = [urlStr stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];

    //1.构造NSURL对象
    NSURL *url = [NSURL URLWithString:urlStr];

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

    //3.创建AFURLSessionManager对象
    AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];

    //4.创建下载任务
    //第二个参数是进度对象指针的地址,为了返回进度
    NSProgress *progress = nil;
    NSURLSessionDownloadTask *task = [manager downloadTaskWithRequest:request progress:&progress destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {

      //返回最终文件所对应的目录
      NSString *toPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/1.mp4"];
      return [NSURL fileURLWithPath:toPath];
    

    } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {

      NSLog(@"%@ error:%@",filePath.path,error);
    

    }];

    //5.启动任务
    [task resume];

    //得到progress对象,需要使用成员变量保存起来
    //用成员变量指向,做了一个强引用,保证刚刚创建的progress对象不会在当前方法结束时消失
    self.myProgress = progress;

    //使用kvc/kvo的设计模式,来观察进度
    //让self做为观察者来观察self.myProgress的属性,fractionCompleted(表示完成的进度)
    [self.myProgress addObserver:self forKeyPath:@"fractionCompleted" options:NSKeyValueObservingOptionNew context:nil];

}

//观察者调用的方法
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if (object == self.myProgress && [keyPath isEqualToString:@"fractionCompleted"]) {

    //回到主线程,更新进度条的显示
    dispatch_async(dispatch_get_main_queue(), ^{
        
        [self.myProgressView setProgress:self.myProgress.fractionCompleted animated:YES];
        NSLog(@"%.2lf",self.myProgress.fractionCompleted);
    });
    
}

}

二 图片选取器 UIImagePickerController
见【Demo】-【3-UIImagePickerController】

  • (IBAction)changeImage:(id)sender {

    //创建图片选取器对象
    UIImagePickerController *pickVC = [[UIImagePickerController alloc] init];

    pickVC.delegate = self;

    [self presentViewController:pickVC animated:YES completion:nil];

}

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

  • (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
    }

pragma mark -图片选取器对应的代理方法

//1.当我们选中相册中的某张图片,调用
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
NSLog(@"选中了某张图片");
//获得选中图片所对应的原图
UIImage *image = info[@"UIImagePickerControllerOriginalImage"];//打印info,找到图片对应的key值
self.myImageView.image = image;
// NSLog(@"%@",info);
[self dismissViewControllerAnimated:YES completion:nil];
}

//2.当我们点击cancle调用
-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
NSLog(@"cancel");
//直接返回
[self dismissViewControllerAnimated:YES completion:nil];

}

关于状态栏样式的设置:
1.在info.plist文件添加属性View controller-based status bar appearance 值设置no
2.在代码部分设置
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容