AFNetWorking 代码研读(一)
- 利用同步并发队列与
dispatch_barrier_sync实现字典并发读取,串行写入
// 创建一个并发队列
self.requestHeaderModificationQueue = dispatch_queue_create("requestHeaderModificationQueue", DISPATCH_QUEUE_CONCURRENT);
复制代码
将HTTPRequestHeaders声明为readonly后,通过setValue: forHTTPHeaderField: 方法赋值HTTPRequestHeader。 是一种很巧妙的设计方法,HTTPRequestHeaders对外部只负责查看里面的请求头,外部赋值需要通过走setValue: forHTTPHeaderField: 方法。
@property (readonly, nonatomic, strong) NSDictionary <NSString *, NSString *> *HTTPRequestHeaders;
复制代码
重写HTTPRequestHeaders的get方法,在内部使用同步并发队列,在读取HTTPRequestHeaders内容时候,将会在当前线程以并发形式读取
- (NSDictionary *)HTTPRequestHeaders {
NSDictionary __block *value;
dispatch_sync(self.requestHeaderModificationQueue, ^{
value = [NSDictionary dictionaryWithDictionary:self.mutableHTTPRequestHeaders];
});
return value;
}
复制代码
dispatch_barrier_async 在官方文档有提到,提交一个栅栏函数在异步中执行,会立马返回。
dispatch_barrier_sync 提交一个栅栏函数执行,会等待栅栏函数执行完。
换言之执行dispatch_barrier_async会继续往下走,dispatch_barrier_async仍然保留在队列中执行,而dispatch_barrier_sync等栅栏函数执行完才会执行后面的任务。
所以在此处用dispatch_barrier_sync在并发队列中达到了串行的效果
// set方法
- (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field
{
dispatch_barrier_sync(self.requestHeaderModificationQueue, ^{
[self.mutableHTTPRequestHeaders setValue:value forKey:field];
});
}
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END























![[桜井宁宁]COS和泉纱雾超可爱写真福利集-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/4d3cf227a85d7e79f5d6b4efb6bde3e8.jpg)

![[桜井宁宁] 爆乳奶牛少女cos写真-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/d40483e126fcf567894e89c65eaca655.jpg)