AFNetWorking 代码研读(一)

AFNetWorking 代码研读(一)

  1. 利用同步并发队列与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
喜欢就支持一下吧
点赞0 分享