zoukankan      html  css  js  c++  java
  • 线程安全的nsmutabledictionary(读weex代码)

    #import <Foundation/Foundation.h>
    
    /**
     *  @abstract Thread safe NSMutableDictionary
     */
    @interface WXThreadSafeMutableDictionary<KeyType, ObjectType> : NSMutableDictionary
    
    @end
    #import "WXThreadSafeMutableDictionary.h"
    
    @interface WXThreadSafeMutableDictionary ()
    
    @property (nonatomic, strong) dispatch_queue_t queue;
    @property (nonatomic, strong) NSMutableDictionary* dict;
    
    @end
    
    @implementation WXThreadSafeMutableDictionary
    
    - (instancetype)initCommon
    {
        self = [super init];
        if (self) {
            NSString* uuid = [NSString stringWithFormat:@"com.taobao.weex.dictionary_%p", self];
            _queue = dispatch_queue_create([uuid UTF8String], DISPATCH_QUEUE_CONCURRENT);
        }
        return self;
    }
    
    - (instancetype)init
    {
        self = [self initCommon];
        if (self) {
            _dict = [NSMutableDictionary dictionary];
        }
        return self;
    }
    
    - (instancetype)initWithCapacity:(NSUInteger)numItems
    {
        self = [self initCommon];
        if (self) {
            _dict = [NSMutableDictionary dictionaryWithCapacity:numItems];
        }
        return self;
    }
    
    - (NSDictionary *)initWithContentsOfFile:(NSString *)path
    {
        self = [self initCommon];
        if (self) {
            _dict = [NSMutableDictionary dictionaryWithContentsOfFile:path];
        }
        return self;
    }
    
    - (instancetype)initWithCoder:(NSCoder *)aDecoder
    {
        self = [self initCommon];
        if (self) {
            _dict = [[NSMutableDictionary alloc] initWithCoder:aDecoder];
        }
        return self;
    }
    
    - (instancetype)initWithObjects:(const id [])objects forKeys:(const id<NSCopying> [])keys count:(NSUInteger)cnt
    {
        self = [self initCommon];
        if (self) {
            _dict = [NSMutableDictionary dictionary];
            for (NSUInteger i = 0; i < cnt; ++i) {
                _dict[keys[i]] = objects[i];
            }
            
        }
        return self;
    }
    
    - (NSUInteger)count
    {
        __block NSUInteger count;
        dispatch_sync(_queue, ^{
            count = _dict.count;
        });
        return count;
    }
    
    - (id)objectForKey:(id)aKey
    {
        __block id obj;
        dispatch_sync(_queue, ^{
            obj = _dict[aKey];
        });
        return obj;
    }
    
    - (NSEnumerator *)keyEnumerator
    {
        __block NSEnumerator *enu;
        dispatch_sync(_queue, ^{
            enu = [_dict keyEnumerator];
        });
        return enu;
    }
    
    - (void)setObject:(id)anObject forKey:(id<NSCopying>)aKey
    {
        aKey = [aKey copyWithZone:NULL];
        dispatch_barrier_async(_queue, ^{
            _dict[aKey] = anObject;
        });
    }
    
    - (void)removeObjectForKey:(id)aKey
    {
        dispatch_barrier_async(_queue, ^{
            [_dict removeObjectForKey:aKey];
        });
    }
    
    - (void)removeAllObjects{
        dispatch_barrier_async(_queue, ^{
            [_dict removeAllObjects];
        });
    }
    
    - (id)copy{
        __block id copyInstance;
        dispatch_sync(_queue, ^{
            copyInstance = [_dict copy];
        });
        return copyInstance;
    }
    
    @end
  • 相关阅读:
    Windows 平台下的Mysql集群主从复制
    IOS 的loadView 及使用loadView中初始化View注意的问题。(死循环并不可怕)
    【2013625】K2+SAP集成应用解决方案在线研讨会
    to_char 和 to_date 经验分享
    Java向Access插入数据
    spring Bean的生命周期管理
    [置顶] 30分钟,让你成为一个更好的程序员
    Spring框架中Bean的生命周期
    Box2D的相关知识
    第八周项目二
  • 原文地址:https://www.cnblogs.com/wxm5558/p/6516885.html
Copyright © 2011-2022 走看看