iOS进阶学习-初识AFNetworking

一、AFNetworking简介

  • AFNetworking是一个 在iOS开发中 使用非常多网络开源库
  • 适用于iOS以及Mac OS X。它构建于在(Apple iOS开发文档) NSURLConnection ,  NSOperation , 以及其他熟悉的Foundation技术之上。
  • 它拥有良好的架构,丰富的api,以及模块化构建方式,使得使用起来非常轻松。
  • 官方链接http://cocoadocs.org/docsets/AFNetworking/1.3.0/。
  • AFNetworking是一个轻量级的网络请求API类库。是以NSURLConnection, NSOperation和其他方法为基础的。
  • 核心代码:AFHTTPRequestOperationManager。
  • AFNetworking 拥有良好的架构,丰富的api,以及模块化构建方式,使得使用起来非常轻松。
  • AFNetworking3.0目前使用NSURLSession作为网络类。

二、AFNetworking功能梳理

  • AFURLConnectionOperation : 继承自NSOperation 实现了NSURLConnection 的代理方法。
  • AFHTTPRequestOperation : 继承自AFURLConnectionOperation的子类,当request请求使用的协议为HTTP和HTTPS时使用,它封装了用于 决定request是否成功的状态码和内容类型。
  • AFJSONRequestOperation : 继承自AFHTTPRequestOperation,用于下载和处理json response数据。
  • AFXMLRequestOperation : 继承自 AFHTTPRequestOperation,用于下载和处理xml response数据。
  • AFPropertyListRequestOperation : 继承自 AFHTTPRequestOperation,用于下载和处理 property list  response数据。
  • AFHTTPClient :是一个封装了基于http协议的网络应用程序的公共交流模式。包含:
  • 发起基于根路径的使用基本的url相关路径来只做request。
  • 为request自动添加设置http headers。
  • 使用http 基础证书或者OAuth来验证request。
  • 为由client制作的requests管理一个NSOperationQueue。
  • 从NSDictionary生成一个查询字符串或http bodies。
  • 从request中构建多部件。
  • 自动的解析http response数据为相应的表现数据。
  • 在网络可达性测试用监控和响应变化。

  注意:AFNetworking可以进行JSON数据解析/Plist数据解析.(不支持XML数据解析)。URL字符串中如果有特殊字符或者中文字符,AFNETWorking并没有做UTF8的转码,需要:url = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

三、代码示例

  用CocoaPods导入AFNetworking(用storyboard创建按钮,并关联事件):

#import "ViewController.h"
// 网络请求的头文件
#import <AFNetworking.h>
#import <AFNetworkActivityIndicatorManager.h>
@interface ViewController ()

{
    /// 进行网络监测判断的Bool值
    BOOL isOpen;
}
/// 用于网络请求的session对象
@property (nonatomic, strong) AFHTTPSessionManager *session;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // 初始化session对象
    self.session = [AFHTTPSessionManager manager];
    // 设置请求接口回来的时候支持什么类型的数据
    self.session.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"application/x-json",@"text/html",nil];

}
#pragma makr - 网络监测按钮的响应方法
- (IBAction)networkMonitoringAction:(id)sender {
    if (!isOpen) {
        // 打开网络监测
        [[AFNetworkReachabilityManager sharedManager] startMonitoring];
        isOpen = YES;
    }else {
        // 关闭网络监测
        [[AFNetworkReachabilityManager sharedManager] stopMonitoring];
        isOpen = NO;
    }
    // 接下来会判断当前是wifi状态还是3G状态还是网络不可用状态

    [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        switch (status) {
            case AFNetworkReachabilityStatusUnknown:
                NSLog(@"当前网络处于未知状态");
                break;
            case AFNetworkReachabilityStatusNotReachable:
                NSLog(@"当前网络处于未连接状态");
                break;
            case AFNetworkReachabilityStatusReachableViaWWAN:
                NSLog(@"3G或4G网络");
                break;
            case AFNetworkReachabilityStatusReachableViaWiFi:
                NSLog(@"WiFi");
                break;
            default:
                break;
        }
    }];
}
#pragma mark - get请求
- (IBAction)getRequestAction:(id)sender {
    [self.session GET:@"http://api.yhouse.com/m/city/dynmiclist" parameters:nil progress:^(NSProgress * _Nonnull downloadProgress) {
        NSLog(@"这事进度条 = %@", downloadProgress);
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSLog(@"请求成功:%@", responseObject);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"请求失败%@", error);
    }];
}
#pragma mark - post请求
- (IBAction)postRequestAction:(id)sender {
    /*{
     do = "pri_memberlist";
     "member_id" = zpHr2dsRvQQxYJxo2;
     "workspace_id" = ILfYpE4Dhs2gWcuQx;
     }*/
    [AFNetworkActivityIndicatorManager sharedManager].enabled = YES;
    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
    NSString *urlStr = @"http://m.taskwedo.com/API/wedo1/wedo.php";
    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    [dict setValue:@"pri_memberlist" forKey:@"do"];
    [dict setValue:@"zpHr2dsRvQQxYJxo2" forKey:@"member_id"];
    [dict setValue:@"ILfYpE4Dhs2gWcuQx" forKey:@"workspace_id"];
    [self.session POST:urlStr parameters:dict progress:^(NSProgress * _Nonnull uploadProgress) {
        NSLog(@"上传进度 = %@", uploadProgress);
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSLog(@"post请求成功 = %@", responseObject);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"请求失败 = %@", error);
    }];
}
#pragma mark post请求
- (IBAction)post2RequestAction:(id)sender {
    /*address = "";
      comment = "\U7c7b\U6a21\U5757\U8ba1\U5212\U7528\U5230\U7b2c\U4e09\U90e8\U5206\U4e2d\Uff0c\U5f85\U63d0\U95ee\U3001\U56de\U7b54\U79ef\U7d2f\U5230\U4e00\U5b9a\U6570\U91cf\U65f6\Uff0c\U4fbf\U4e8e\U5927\U5bb6\U7684\U95ee\U9898\U7684\U5feb\U901f\U67e5\U627e\Uff0c\U6240\U4ee5\U63d0\U95ee\U90e8\U5206\U6682\U65f6\U4e0d\U52a0\U5165\U8fd9\U4e2a";
      do = "add_comment";
      kind = task;
      "member_id" = zpHr2dsRvQQxYJxo2;
      other = "";
      "task_id" = 55a47e79ec25e3641;*/

    NSString *urlStr = @"http://m.taskwedo.com/API/wedo1/wedo.php";
    NSString *commonContent = @"类模块计划用到第三部分中,待提问、回答积累到一定数量时,便于大家的问题的快速查找,所以提问部分暂时不加入这个";
    commonContent = [commonContent stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
    NSMutableDictionary *dic = [NSMutableDictionary dictionary];
    [dic setValue:@"" forKey:@"address"];
    [dic setValue:commonContent forKey:@"comment"];
    [dic setValue:@"add_comment" forKey:@"do"];
    [dic setValue:@"task" forKey:@"kind"];
    [dic setValue:@"zpHr2dsRvQQxYJxo2" forKey:@"member_id"];
    [dic setValue:@"" forKey:@"other"];
    [dic setValue:@"55a47e79ec25e3641" forKey:@"task_id"];
    [self.session POST:urlStr parameters:dic progress:^(NSProgress * _Nonnull uploadProgress) {
        NSLog(@"上传进度 = %@", uploadProgress);

    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSLog(@"post请求成功 = %@", responseObject);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"请求失败 = %@", error);
    }];
}
@end
时间: 2024-11-04 11:57:43

iOS进阶学习-初识AFNetworking的相关文章

iOS进阶学习笔记

熟练掌握C/C++/Objective-C/Swift语言: 熟悉Cocoa Touch(Foundation,UIKit).Objective-C中block,gcd,NSOperation等: 熟悉Object消息传递等机制,Objective-C Runtime,阅读源码: 熟练使用大部分iOS平台常用库,开源库(AFNetworking,SDWebImage,fmdb),开源控件(EGOTableViewPullRefresh,MRProgress); 关注github上iOS平台开源项

iOS进阶学习-CocoaPods的安装与使用

一.CocoaPods的安装 1.简介: CocoaPods是一个用来帮助我们管理第三方依赖库的工具. 在开发iOS应用时,会经常使用第三方类库,比如SDWebImage.AFNetworking等等,手动的下载与添加类库非常麻烦,通过CocoaPods可以便捷的下载与管理第三方类库. 使用CocoaPods的目的是让我们能自动化的.集中的.直观的管理第三方开源库. 官方链接:https://cocoapods.org 2.安装步骤 第一步:打开终端,查看自己电脑的ruby环境:gem sour

iOS进阶学习-地图

一.地图的简介 在移动互联网时代,移动app能解决用户的很多生活琐事,比如: 导航:去任意陌生的地方. 周边:找餐馆.找酒店.找银行.找电影院. 手机软件:微信摇一摇.QQ附近的人.微博.支付宝等. 在上述应用中,都用到了地图和定位功能,在iOS开发中,要想加入这两大功能,必须基于两个框架进行开发: Map Kit :用于地图展示. Core Location :用于地理定位. 二.地图定位(CoreLocation框架,地理编码与反地理编码) 1.CoreLocation框架的使用 导入头文件

iOS进阶学习-多线程

一.多线程概述 1.程序,进程,线程 程序:由源代码生成的可执行应用.(例如:QQ.app) 进程:一个正在运行的程序可以看做一个进程.(例如:正在运行的QQ就是一个进程),进程拥有独立运行所需的全部资源. 线程:程序中独立运行的代码段.(例如:接收QQ消息的代码) 一个进程是由一或多个线程组成.进程只负责资源的调度和分配,线程才是程序真正的执行单元,负责代码的执行. 2.单线程 每个正在运行的程序(即进程),至少包含一个线程,这个线程叫主线程. 主线程在程序启动时被创建,用于执行main函数.

iOS进阶学习-网络之数据请求

注:文中出现的网站只做用例子,所以有些已经失效的网站,具体URL大家可以自己上网搜索相关资源. 一.HTTP和HTTPS协议 1.URL: URL全称是Uniform Resource Locator(统一资源定位符)通过1个URL,能找到互联网上唯一的1个资源 URL就是资源的地址.位置,互联网上的每个资源都有一个唯一的URL URL的基本格式=协议://主机地址/路径 http://www.cnblogs.com/soley 协议:不同的协议,代表着不同的资源查找方式,资源传输方式 主机地址

iOS进阶学习-数据处理之文件读写

一.沙盒机制 1.什么是沙盒? 每一个iOS应用程序都会为自己创建一个文件系统目录(文件夹),这个独立.封闭.安全的空间,叫做沙盒. 2.沙盒机制(SandBox) 沙盒是一种安全体系. 它规定了应用程序只能在为该应用程序创建的文件夹(沙盒)内访问文件,不可以访问其它沙盒内的内容(iOS8之后已经部分开放访问). 所有的非代码文件都保存在这个地方,比如图片.声音.属性列表(plist).sqlite数据库和文本文件等. 3.沙盒机制的特点: 每个应用程序的活动范围都限定在自己的沙盒里. 不能随意

iOS进阶学习-数据库

一.数据库管理系统 1.SQL语言概述:SQL是Structured Query Language(结构化查询语言)的缩写.SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言. 2.常见的数据库: MySQL:MySQL是一个精巧的SQL数据库管理系统,而且是开源的数据管理系统.MySQL主要目标是快速.健壮和易用.它拥有强大的功能.灵活性.丰富的应用编程接口(API)以及精巧的系统结构. Oracle:Oracle Database,又名Oracle RDBMS,或简称Oracl

iOS进阶学习-多媒体

一.音频 1.iOS 里面共有四种专门实现播放音频的方式: System Sound Services(系统声音服务). OpenAL(跨平台的开源的音频处理接口). Audio Queue Services(播放和录制音频服务). AVAudioPlayer(高级音频播放器). 在这里我们主要介绍一下System Sound Services和AVAudioPlayer. 2.System Sound Services System Sound Services 是最底层也是最简单的声音播放服

iOS进阶学习-CoreData

一.CoreData数据库框架的优势 1.CoreData数据持久化框架是Cocoa API的一部分,首次在iOS5版本的系统中出现,它允许按照实体-属性-值模型组织数据,并以XML.二进制文件或者SQLite数据文件的格式持久化数据.CoreData主要提供独享-关系映射(ORM)功能,把OC对象转化为数据保存到文件,也可以数据转化为OC对象. 2.CoreData数据库框架的优势: sqlite: 基于C接口需要使用sql语句,代码繁琐. 在处理大量数据时,表关系更直观. 在OC中不是可视化