第三方库

###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的二级缓存原理)是

  • 1.首先在内存(NSCache)中根据url为索引查找对应的缓存,找到直接显示图片
  • 2.如果在内存中找不到,再根据url的md5值作为key在磁盘缓存中查找(指本地文件),找到就把数据加载内存中并显示图片
    • 3.内存和磁盘缓存都找不到,就向服务器发起请求下载图片。下载成功后将图片存放到内存。并写入磁盘

      缺点:因为磁盘存储的是cache文件夹,每杀死一次进程就需要重新下载。

###AFNetworking实现原理?为什么要用AFNetworking? AFNetworking 封装的系统的网络请求库NSURLSession,主要有负责网络通信模块的AFURLSessionManager . 负责网络通信的策略模块AFSecurityPolicy, 负责网络状态监听的模块AFNetworkReachabilityManager 负责网络通信序列化,反序列化的模块AFURLRe 实现原理:

  • 下载使用的是NSURLSession,
  • 完成或错误进度回掉是block形式,
  • 管理下载的是gcd的全局串行队列,
  • 真正的请求部分是在gcd的block中完成的

好处:

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];

Hook学习
JSRUN前端笔记, 是针对前端工程师开放的一个笔记分享平台,是前端工程师记录重点、分享经验的一个笔记本。JSRUN前端采用的 MarkDown 语法 (极客专用语法), 这里属于IT工程师。