美文网首页
iOS 多线程系列之dispatch_barrier_async

iOS 多线程系列之dispatch_barrier_async

作者: 人魔七七 | 来源:发表于2018-11-20 10:09 被阅读21次

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

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

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

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

    我们需要实现下图的效果

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

    看一段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

          本文链接:https://www.haomeiwen.com/subject/mqdtqqtx.html