对字典数组等属性的读写操作为保证线程安全问题,需要加一个锁来保证。
用@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
网友评论