zoukankan      html  css  js  c++  java
  • GCD实现多读单写

    #import "WHObject.h"
    
    @interface WHObject()
    
    @property (nonatomic, strong) dispatch_queue_t dictQueue;//并发队列
    @property (nonatomic, strong) NSMutableDictionary *dict;//可变字典
    
    @end
    
    @implementation WHObject
    
    - (instancetype)init {
        if(self = [super init]) {
            _dictQueue = dispatch_queue_create("com.huangwenhong.queue", DISPATCH_QUEUE_CONCURRENT);
            _dict = [NSMutableDictionary dictionary];
        }
        return self;
    }
    
    - (void)huangwenhongmethod {
        self.target = [NSObject new];
    }
    
    - (id)valueForKey:(NSString *)key {
        id __block obj;
        dispatch_sync(_dictQueue, ^{//因为有数据 return,所以这里是同步调用
            obj = [self.dict valueForKey:key];
        });
        return obj;
    }
    
    - (void)setObject:(id)obj forKey:(id<NSCopying>)key {
        //重点:dispatch_barrier_async(),异步栅栏调用;
        //只有提交到并行队列才有意义
        dispatch_barrier_async(_dictQueue, ^{
            [self.dict setObject:obj forKey:key];
        });
    }
    @end

    总结:首先栈栏函数的作用,是执行到当前位置,前面的全部任务都要等待,等待block内部任务执行完成后,继续执行其他任务。(面试时候的问题,用锁不知道能不能实现)

  • 相关阅读:
    解决ios下的微信页面背景音乐无法自动播放问题
    vue Vue-cli 笔记
    document.documentElement和document.body区别介绍
    GD库使用小结---2
    GD库使用小结---1
    踩到两只“bug”
    CI加载流程小结
    文件加载---理解一个project的第一步
    缓存的使用
    小小的分页
  • 原文地址:https://www.cnblogs.com/coolcold/p/12430568.html
Copyright © 2011-2022 走看看