###GCDAsyncSocket :异步socket,是基于C语言实现。
实现原理:首先使用GCD创建异步线程并在线程中建立c语言级别的socket连接。
然后在线程中建立c语言的输入输出流,并分别设置读写回调,
连接成功或者读写数据完成都会返回主线程,然后通过外部接口返回数据
缺点是:每次发送数据会需要客户端主动读取数据,否则获取不到服务器的返回
###SDWebImage里面给UIImageView加载图片的逻辑
效果时设置了下载url的imageview会在图片下载完成前使用占位图片,下载完成后替换为真实图片,
具体处理过程如下:
1.首先在内存中根据url为索引查找对应的缓存,找到直接显示图片(NSCache )
2.如果在内存中找不到,就url 的md5作为key在磁盘缓存中查找(指本地文件),找到就把数据加载内存中并显示图片
3.内存和磁盘缓存都找不到,就向服务器发起请求下载图片。下载成功后将图片存放到内存。并写入磁盘,这一步采用了请求缓存NSURLCache,缓存获取过的图片的请求。
整个获取图片过程在子线程中进行,获取到图片切到主线程来显示图片
确定:因为磁盘存储的是cache文件夹,每杀死一次进程就需要重新下载。
###AFNetworking实现原理?
实现原理:下载使用的是NSURLSession,完成或错误进度回掉是block形式,管理下载是是gcd的全局串行队列,真正的部分是在gcd的block中完成的 好处: 1、带block形式, 。 2、还对uikit 内部的类进行类别形式添加方法(异步下载图片)。 3、还可以检测网络状态。
###SDWebImage给UIImageView加载图片的逻辑
效果是imageview会在图片下载完成前使用占位图片,下载完成后替换为真实图片
具体处理过程(也就是SDWebImage的二级缓存原理)是
缺点:因为磁盘存储的是cache文件夹,每杀死一次进程就需要重新下载。
###AFNetworking实现原理?为什么要用AFNetworking? AFNetworking 封装的系统的网络请求库NSURLSession,主要有负责网络通信模块的AFURLSessionManager . 负责网络通信的策略模块AFSecurityPolicy, 负责网络状态监听的模块AFNetworkReachabilityManager 负责网络通信序列化,反序列化的模块AFURLRe 实现原理:
好处:
1、带block形式,
2、还对uikit内部的类进行类别形式添加方法(异步下载图片)
3、还可以检测网络状态。
AFnetworking : AFNetworking AFNetworking由五个模块组成: 分别由NSURLSession,Security,Reachability,Serialization,UIKit五部分组成 NSURLSession:网络通信模块(核心模块) 对应 AFNetworking中的 AFURLSessionManager和对HTTP协议进行特化处理的AFHTTPSessionManager,AFHTTPSessionManager是继承于AFURLSessionmanager的 Security:网络通讯安全策略模块 对应 AFSecurityPolicy Reachability:网络状态监听模块 对应AFNetworkReachabilityManager Seriaalization:网络通信信息序列化、反序列化模块 对应 AFURLResponseSerialization UIKit:对于IOSUIKit的扩展库
网络请求的过程: 创建NSURLSessionConfig对象–用创建的config对象配置初始化NSURLSession–创建NSURLSessionTask对象并resume执行,用delegate或者block回调返回数据。 AFURLSessionManager封装了上述网络交互功能 AFURLSessionManager请求过程 1.初始化AFURLSessionManager。 2.获取AFURLSessionManager的Task对象 3.启动Task AFURLSessionManager会为每一个Task创建一个AFURLSessionmanagerTaskDelegate对象,manager会让其处理各个Task的具体事务,从而实现了manager对多个Task的管理 初始化好manager后,获取一个网络请求的Task,生成一个Task对象,并创建了一个AFURLSessionmanagerTaskDelegate并将其关联,设置Task的上传和下载delegate,通过KVO监听download进度和upload进度 NSURLSessionDelegate的响应 因为AFURLSessionmanager所管理的AFURLSession的delegate指向其自身,因此所有的 NSURLSessiondelegate的回调地址都是AFURLSessionmanager,而AFURLSessionmanager又会根据是否需要具体处理会将AF delegate所响应的delegate,传递到对应的AF delegate去
AFURLSessionManager :
self.sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration]; self.operationQueue = [[NSOperationQueue alloc] init]; self.operationQueue.maxConcurrentOperationCount = 1;
self.session = [NSURLSession sessionWithConfiguration:self.sessionConfiguration delegate:self delegateQueue:self.operationQueue];
self.responseSerializer = [AFJSONResponseSerializer serializer];
self.securityPolicy = [AFSecurityPolicy defaultPolicy];
Manager 包含AFURLRequestSerialization
Resonse: AFURLResponseSerialization self.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", nil];
NSMutableURLRequest *mutableRequest = [[NSMutableURLRequest alloc] initWithURL:url]; mutableRequest.HTTPMethod = method;
[self.HTTPRequestHeaders enumerateKeysAndObjectsUsingBlock:^(id field, id value, BOOL * __unused stop) {
if (![request valueForHTTPHeaderField:field]) {
[mutableRequest setValue:value forHTTPHeaderField:field];
}
}];
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:parameters options:self.writingOptions error:error];
if (!jsonData) {
return nil;
}
[mutableRequest setHTTPBody:jsonData];
dataTask = [self.session dataTaskWithRequest:request];