美文网首页
GCD多读单写

GCD多读单写

作者: zhengxiaolang | 来源:发表于2020-07-01 15:54 被阅读0次

在某些场景下为了提高效率,就需要使用多读单写,
这就需要我们使用到GCD中的两个栅栏函数

dispatch_barrier_sync(queue,  ^{
     //需等待这里的block任务执行完,才能执行后面异步任务
 })

dispatch_barrier_async(queue,  ^{
   //不需要等待block任务执行完,就能执行后面异步任务
})

这两者区别是
1、barrier_sync会阻塞它之后的任务的入队,必须等到 barrier_sync 任务执行完毕,才会把后面的异步任务添加到并发队列中,
2、而 barrier_async不需要等自身的 block 执行完成就可以把后面的任务添加到队列中。

举例:
以读取图片缓存为例来说明:

@property(nonatomic,strong)NSMutableDictionary *imageDic;//假设用于保存图片缓存
@property(nonatomic,strong)dispatch_queue_t concurrent_queue;//并发队列

-(void)initProperties{
    //创建一个并发队列
    _concurrent_queue = dispatch_queue_create("mutliRead_singleWrite", DISPATCH_QUEUE_CONCURRENT);
    //创建字典
    _imageDic = [NSMutableDictionary dictionary];
}

//可以多线程进行读
-(UIImage *)getImageWithKey:(NSString *)url{
//    __block UIImage *image;
//    dispatch_async(self.concurrent_queue, ^{
//        image = [self.imageDic valueForKey:url];
//    });
    
    UIImage *image;
    image = [self.imageDic valueForKey:url];
    return image;
}
//只能单线程进行写
-(void)setImageWithKey:(NSString *)key withImg:(UIImage *)image{
    
    dispatch_sync(self.concurrent_queue, ^{
        [self.imageDic setValue:image forKey:key];
    });
}

//防止多线程同时访问资源,每次只能让一个线程访问进行读写
-(UIImage *)getSafeImage:(NSString *)url{
    UIImage *image;
    @synchronized (self.imageDic) {
        image = [self.imageDic valueForKey:url];
    }
    return image;
}

-(void)setSafeImageWithKey:(NSString *)key withImg:(UIImage *)image{
    @synchronized (self.imageDic) {
        [self.imageDic setValue:image forKey:key];
    }
}

相关文章

  • iOS 多线程面试题(dispatch_barrier_asyn

    dispatch_barrier_async 1、问:怎么用GCD实现多读单写? 多读单写的意思就是:可以多个读者...

  • GCD多读单写

    在某些场景下为了提高效率,就需要使用多读单写,这就需要我们使用到GCD中的两个栅栏函数 这两者区别是1、barri...

  • 如何实现多读单写

    一.使用GCD实现多读单写 1.dispatch_barrier_async dispatch_barrier_s...

  • GCD 实现多读单写

    总结:首先栈栏函数的作用,是执行到当前位置,前面的全部任务都要等待,等待block内部任务执行完成后,继续执行其他任务。

  • 多线程

    GCD 一 :同步/异步 和 串行/并发 二:dispatch_barrier_async 解决多读单写的问题 三...

  • 关于iOS使用gcd barrier函数实现多读单写的思考

    看简书面试题时看到这样一篇gcd相关的文章, 提到多读单写,并有配图如下 单写没有问题,多读?需要在任意队列异步执...

  • GCD数据多读单写方案

    多线程访问共享资源数据的时候,需要使用多读单写方案, 不然数据就会异常。 读和读之间是并发的 读和写之间是互斥的 ...

  • 使用 GCD 进行多读单写

  • 多线程

    主要内容:1 GCD队列循环等待、多读单写、组任务2 NSOpertaion优点3 NSThread实现原理4 常...

  • block分析(上)

    读写锁的补充 实现读写锁的两种方案 对底层pthread进行封装 GCD封装 读写锁要实现的功能 多读单写,多读就...

网友评论

      本文标题:GCD多读单写

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