AFNetWorking
开源网络框架
(1)ASIHttpRequest 是一个使用OC封装了CFNetWorking的网络编程框架,可以轻松实现与服务器之间的网络通信。
(2)AFNetWorking 是基于NSURLConnetion基础之上的一个轻量级网络框架。功能强大可以实现Get请求、Post请求、文件上传、下载、断点续传、网络状态监测等功能。AFNetWorking 与 ASIHttpRequest 有什么区别 都是http框架
AFN基于NSURL,ASI基于底层的CFNetwork框架,因此ASI的性能优于AFN
AFN采取block的方式处理请求,ASI最初采取delegate的方式处理请求,后面也增加了block的方式
AFN只封装了一些常用功能,满足基本需求,直接忽略了很多扩展功能,比如没有封装同步请求;ASI提供的功能较多,预留了各种接口和工具供开发者自行扩展
AFN直接解析服务器返回的JSON、XML等数据,而ASI比较原始,返回的是NSData二进制数据
网络通信模块(AFURLSessionManager、AFHTTPSessionManger)
网络状态监听模块(Reachability)
网络通信安全策略模块(Security)
网络通信信息序列化/反序列化模块(Serialization)
对于iOS UIKit库的扩展(UIKit)
@property (readonly, nonatomic, assign) AFSSLPinningMode SSLPinningMode
验证证书的模式:
AFSSLPinningModeNone: 这个模式表示不做SSL pinning,只跟浏览器一样在系统的信任机构列表里验证服务端返回的证书。若证书是信任机构签发的就会通过,若是自己服务器生成的证书,这里是不会通过的。
AFSSLPinningModeCertificate:这个模式表示用证书绑定方式验证证书,需要客户端保存有服务端的证书拷贝,这里验证分两步,第一步验证证书的域名/有效期等信息,第二步是对比服务端返回的证书跟客户端返回的是否一致。
AFSSLPinningModePublicKey:这个模式同样是用证书绑定方式验证,客户端要有服务端的证书拷贝,只是验证时只验证证书里的公钥,不验证证书的有效期等信息。
@property (nonatomic, strong, nullable) NSSet *pinnedCertificates
根据验证模式来返回用于验证服务器的证书。
@property (nonatomic, assign) BOOL allowInvalidCertificates
属性代表是否允许不信任的证书(证书无效、证书时间过期)通过验证 ,默认为NO.
@property (nonatomic, assign) BOOL validatesDomainName
是否验证域名证书的CN(common name)字段。默认值为YES。
- (AFSecurityPolicy *)customSecurityPolicy {
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"server_ios" ofType:@"cer"];
NSData *cerData = [NSData dataWithContentsOfFile:cerPath];
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
//验证自建证书
securityPolicy.allowInvalidCertificates = YES;
securityPolicy.validatesDomainName = NO;
securityPolicy.pinnedCertificates = [NSSet setWithObject:cerData];
return securityPolicy;
}
从UIImageView+AFNetWorking来看网络请求工具:
1.
1.AFAutoPurgingImageCache
- (void)addImage:(UIImage*)image withIdentifier:(NSString*)identifier {
dispatch_barrier_async(self.synchronizationQueue, ^{
AFCachedImage*cacheImage = [[AFCachedImagealloc]initWithImage:imageidentifier:identifier];
//如果以前存储了~~~~ 就去掉内存
AFCachedImage*previousCachedImage =self.cachedImages[identifier];
if(previousCachedImage !=nil) {
self.currentMemoryUsage-= previousCachedImage.totalBytes;
}
//更新存储
self.cachedImages[identifier] = cacheImage;
self.currentMemoryUsage += cacheImage.totalBytes;
});
//添加了图片也要看下总内存有没有超出
dispatch_barrier_async(self.synchronizationQueue, ^{
//如果当前的内存大于期望内容
if (self.currentMemoryUsage > self.memoryCapacity) {
//计算需要清除掉的内存大小
UInt64 bytesToPurge = self.currentMemoryUsage - self.preferredMemoryUsageAfterPurge;
//内存中所有的图片
NSMutableArray *sortedImages = [NSMutableArray arrayWithArray:self.cachedImages.allValues];
NSSortDescriptor*sortDescriptor = [[NSSortDescriptoralloc]initWithKey:@"lastAccessDate"
ascending:YES];
[sortedImagessortUsingDescriptors:@[sortDescriptor]];
//对内存中的图片按存储时间的顺序进行排序
UInt64bytesPurged =0;
for(AFCachedImage*cachedImageinsortedImages) {
//遍历循环清除图片
[self.cachedImages removeObjectForKey:cachedImage.identifier];
bytesPurged += cachedImage.totalBytes;
//直到清除的内存大于等于 前面计算的应该清楚的内存
if(bytesPurged >= bytesToPurge) {
break;
}
}
//记得 当前的使用的内存要减去清除的内存
self.currentMemoryUsage-= bytesPurged;
}
});
}