AFNetWorking

2018-05-16  本文已影响9人  一代骄马

开源网络框架

(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二进制数据

原文 :AFNetworking到底做了什么? - 简书

AFNetworking到底做了什么(二)?

AFNetworking之于https认证

AFNetworking之UIKit扩展与缓存实现

网络通信模块(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;

        }

    });

}

2.AFImageDowloader

上一篇下一篇

猜你喜欢

热点阅读