ios开发循环网络请求_iOS网络开发(7)大牛们的杰作AFNetworking

本篇文章介绍传说中的  AFN 框架的使用

AFNetworking是iOS开发中最广泛使用的开源项目之一,是最活跃最有影响力的开源项目之一。

源自一个LBS项目,成功代替了ASIHTTPRequest成为了主流的网络解决方案。

AFN将NSURLConnection与NSOperation结合(内部使用GCD),并在2.0版本开始兼容NSURLSession

使用AFN发送请求可以使用两种方式:

AFHTTPRequestOperationManager和AFURessionManager

如果是数据任务推荐使用第一种,如果是下载/上传任务推荐使用第二种

使用AFHTTPRequestOperationManager

这个类的对象,能够非常方便的创建并发起各种HTTP请求

对象的创建:+ (instancetype)manager

1)发起GET请求:- (nullable AFHTTPRequestOperation *)GET:(NSString *)URLString parameters:(nullable id)parameters success:(nullable void ( ^ ) ( AFHTTPRequestOperation *operation , id responseObject ))success failure:(nullable void ( ^ ) ( AFHTTPRequestOperation *operation , NSError *error ))failure

参数URLString:请求的url

参数parameters:参数字典,GET请求的参数可以放在URL中也可以放在这里

使用@{key1:value1, key2:value2, ...} 代理 key1=value1&key2=value2&...

参数success:请求成功时,执行的block

参数failure:请求失败时,执行的block

返回值:AFHTTPRequestOperation请求任务对象

如:

或将参数放在parameters参数上

2)发起POST请求- (nullable AFHTTPRequestOperation *)POST:(NSString *)URLString parameters:(nullable id)parameters success:(nullable void ( ^ ) ( AFHTTPRequestOperation *operation , id responseObject ))success failure:(nullable void ( ^ ) ( AFHTTPRequestOperation *operation , NSError *error ))failure

如:

请求对象的序列化工具

功能一:完成请求对象的功能

使用AFHTTPRequestOperationManager发送请求参数是NSURL而不是NSURLRequest;之前介绍过,NSURLRequest中并不仅仅是NSURL,还可以:设置请求头参数、设置缓存策略、设置请求超时等

这些功能由请求对象的序列化工具对象完成

功能二:请求的参数自动序列化

除了完成这些本属于NSURLRequest的任务外,还能实现将请求的参数(URL参数及请求体参数)进行序列化,由于很少服务器上请求要求传递JSON/XML数据,所以这个功能很少使用

父类:AFHTTPRequestSerializer

子类:AFJSONRequestSerializer(默认) AFPropertyListRequestSerializer  ...

1)设置请求头的参数- (void)setValue:(nullable NSString *)valueforHTTPHeaderField:(NSString *)field

- (nullable NSString *)valueForHTTPHeaderField:(NSString *)field

@property (readonly, nonatomic, strong) NSDictionary *HTTPRequestHeaders

如:发送GET请求获得用户信息,要求传入header参数  Authorization=tokenID xxxxxx

2)设置缓存策略@property (nonatomic, assign) NSURLRequestCachePolicy cachePolicy

3)通过序列化工具,可以设置请求超时@property (nonatomic, assign) NSTimeInterval timeoutInterval

响应对象的反序列化工具

功能一:将响应数据反序列化

也就是说,如果接受到一个JSON数据,它能帮助我们直接反序列化为OC基本数据对象

功能二:通过一些属性的设定,可以限制接收哪些想要的响应数据

父类:AFHTTPResponseSerializer

子类:AFJSONResponseSerializer AFPropertyListResponseSerializer AFImageResponseSerializer

AFXMLParserResponseSerializer AFXMLDocumentResponseSerializer

默认是AFJSONResponseSerializer,因为大多数的请求都是JSON类型

1)设置能够正确接收的响应数据类型(MIMETYPE):@property (nonatomic, copy, nullable) NSSet *acceptableContentTypes

2)设置能够正确接收的状态码:@property (nonatomic, copy, nullable) NSIndexSet *acceptableStatusCodes

AFURLSessionManager

提供了对NSURLSession操作的封装

创建数据任务:- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request completionHandler:(nullable void ( ^ ) ( NSURLResponse *response , id responseObject , NSError *error ))completionHandler

manager的属性:// 完成block执行所在任务队列

@property (nonatomic, strong, nullable) dispatch_queue_t completionQueue

// 请求执行所在任务队列

@property (readonly, nonatomic, strong) NSOperationQueue *operationQueue

// 响应对象的序列化工具

@property (nonatomic, strong) id responseSerializer

...

下载任务及上传任务在后面的文章介绍

AFNetworkingActivityIndicatorManager

用于方便地管理状态栏上的网络活动指示器

获得全局对象:+ (instancetype)sharedManager

网络活动指示器的显示状态:@property (nonatomic, assign, getter=isEnabled) BOOL enabled

@property (readonly, nonatomic, assign) BOOL isNetworkActivityIndicatorVisible

为了方便正确地控制指示器状态,在管理对象中包含一个整型的引用计数,当>0时显示,==0时不显示

在发起网络请求前,使用下面的方法,对引用计数+1:- (void)incrementActivityCount

在完成网络请求后,使用下面的方法,对引用计数-1:- (void)decrementActivityCount

AFNetworkReachabilityManager

用于检测网络的可达性,如:[[AFNetworkReachabilityManager sharedManager] startMonitoring];

[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {

switch (status) {

case AFNetworkReachabilityStatusNotReachable:

NSLog(@"无网络");      break;

case AFNetworkReachabilityStatusReachableViaWiFi:

NSLog(@"WiFi网络”);   break;

case AFNetworkReachabilityStatusReachableViaWWAN:

NSLog(@"无线网络”);  break;

default:

break;

}

}];

UIKit的分类

AFN框架和SDWebImage类似,也提供了很多UI控件的分类

AFNetworking源码中的一些常用技巧

所有的单例都是用dispatch_once创建,保证只执行一次

block中对self关键字的访问,如代码段:__weak __typeof(self)weakSelf = self;

self.backgroundTaskIdentifier = [application beginBackgroundTaskWithExpirationHandler:^{

__strong __typeof(weakSelf)strongSelf = weakSelf;

}];

第一个weakSelf是为了block中不持有self,避免出现循环引用

第二个strongSelf是为了保证在block执行过程中,这个self不会被释放

常用类的说明

AFURLRequestOperation继承自NSOperation,描述网络请求任务对象

管理着NSURLConnection,并实现了其代理方法

AFHTTPRequestOperation又是AFURLRequestOperation的子类

包含请求任务成功或失败时需要执行的block(实际上这些block是在代理方法中被调用)

AFHTTPRequestOperationManager用于快速创建AFHTTPRequestOperation并添加到任务队列中

AFURLRequestSerialization用于帮助构建NSURLRequest

格式化参数:

一般我们请求都会按key=value的方式带上各种参数,GET方法参数直接加在URL上,POST方法放在body上,NSURLRequest没有封装好这个参数的解析,只能我们自己拼好字符串。AFNetworking提供了接口,让参数可以是NSDictionary, NSArray, NSSet这些类型,再由内部解析成字符串后赋给NSURLRequest。

转化过程大致是这样的:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
iOS语音通话可以通过苹果提供的AVFoundation框架来实现,具体步骤如下: 1. 导入AVFoundation框架 在项目中导入AVFoundation框架,这个框架提供了音频和视频播放、录制、编辑等功能。 2. 创建AVAudioSession会话 AVAudioSession提供了一个音频会话来管理应用程序的音频功能,包括设置音量、启动和停止录音、控制多路音频等。 ```swift let session = AVAudioSession.sharedInstance() do { try session.setCategory(.playAndRecord, mode: .default) try session.setActive(true) } catch { print(error.localizedDescription) } ``` 这里我们设置会话的类别为playAndRecord,表示同时支持播放和录制。 3. 创建AVAudioEngine引擎 AVAudioEngine是一个强大的音频处理引擎,可以用它来处理音频数据。 ```swift let engine = AVAudioEngine() ``` 4. 创建AVAudioPlayerNode节点和AVAudioInputNode节点 AVAudioPlayerNode节点用于播放来自远程用户的音频数据,而AVAudioInputNode节点用于录制本地用户的音频数据。 ```swift let player = AVAudioPlayerNode() let input = engine.inputNode ``` 5. 连接输入和输出 将AVAudioInputNode节点和AVAudioPlayerNode节点连接起来,这样本地用户录制的音频数据就会被发送给远程用户,而远程用户的音频数据则会通过AVAudioPlayerNode节点播放出来。 ```swift engine.connect(input, to: player, format: input.outputFormat(forBus: 0)) ``` 6. 启动引擎 ```swift try? engine.start() ``` 7. 开始录制和播放 用户按下语音对讲按钮时,我们开始录制本地音频数据,并向远程用户发送数据。同时,我们也开始播放来自远程用户的音频数据。 ```swift // 开始录制 input.installTap(onBus: 0, bufferSize: 1024, format: input.outputFormat(forBus: 0)) { (buffer, time) in // 发送数据给远端用户 } // 开始播放 player.play() ``` 8. 停止录制和播放 用户松开语音对讲按钮时,我们停止录制本地音频数据,并停止向远程用户发送数据。同时,我们也停止播放来自远程用户的音频数据。 ```swift // 停止录制 input.removeTap(onBus: 0) // 停止播放 player.stop() ``` 以上就是使用AVFoundation框架实现iOS语音通话的基本步骤,具体实现还需要考虑音频编解码、网络传输等技术细节。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值