AFNetWorking 代码研读(一)
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];
});
}
转载自:https://juejin.cn/post/6966880966170116126