likes
comments
collection
share

AFNetWorking 代码研读(一)

作者站长头像
站长
· 阅读数 28

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];
    });
}
转载自:https://juejin.cn/post/6966880966170116126
评论
请登录