iOS 多线程系列之dispatch_barrier_async 使用

对字典数组等属性的读写操作为保证线程安全问题,需要加一个锁来保证。

用@synchronized 实现锁的机制,但是如果很多地方用这个机制,会造成互相等待,效率不高。

自建一个NSLock来保证线程安全需要特别注意别死锁了。

可以用GCD 来实现保证线程安全问题。

我们需要实现下图的效果

iOS 多线程系列之dispatch_barrier_async 使用_第1张图片

因为读取式并发的并且同步的因为需要马上得到返回的结果 ,写必须是单独执行的。

看一段AFN的代码这个就是使用实例:

- (void)setValue:(NSString *)value

forHTTPHeaderField:(NSString *)field

{

    dispatch_barrier_async(self.requestHeaderModificationQueue, ^{

        [self.mutableHTTPRequestHeaders setValue:value forKey:field];

    });

}
- (NSString *)valueForHTTPHeaderField:(NSString *)field {

    NSString __block *value;

    dispatch_sync(self.requestHeaderModificationQueue, ^{

        value = [self.mutableHTTPRequestHeaders valueForKey:field];

    });

    return value;

}

注意:dispatch_barrier_async在自定义的并发队列里,全局和串形达不到我们要的效果。 苹果文档中指出,如果使用的是全局队列或者创建的不是并发队列,则dispatch_barrier_async实际上就相当于dispatch_async。

参考链接:

https://segmentfault.com/a/1190000002712678

https://www.jianshu.com/p/306481753216

https://github.com/AFNetworking/AFNetworking

你可能感兴趣的:(iOS 多线程系列之dispatch_barrier_async 使用)