objective-c - 线程安全NSMutableDictionary

标签 objective-c multithreading nsdictionary

我写的类SafeMutableDictionary继承了NSMutableDictionary。
该类仅实现“原始”方法,即must be inherits
来自NSDictionary:

- (instancetype)init;
- (instancetype)initWithObjects:(const id [])objects forKeys:(const id<NSCopying>[])keys count:(NSUInteger)cnt;
- (NSUInteger)count;
- (id)objectForKey:(id)key;
- (NSEnumerator*)keyEnumerator;

并来自NSMutableDictionary:
- (void)removeObjectForKey:(id)key;
- (void)setObject:(id)obj forKey:(id)key;

通过使用NSMutableDictionary类型的内部变量来支持线程安全,该变量包含所有数据
@interface SafeMutableDictionary () {
    __strong NSMutableDictionary* _dictEmbedded;
}

并使用@synchronized块对其进行每次包装。
- (id)objectForKey:(id)key{
    @synchronized (_dictEmbedded) {
        return [_dictEmbedded objectForKey:key];
    }
}

github中使用完整代码进行 repo 。

但是,不幸的是,我仍然会因以下错误而崩溃
Collection <__NSDictionaryM: 0x16784ff0> was mutated while being enumerated.

所以,我有一些问题:
1)我的实现是正确的吗?我错过了什么?
2)是否存在更著名且经过测试的解决方案?
3)从主线程和bg线程同时访问容器的最佳实践是什么?
进行此类继承可能是最糟糕的做法,并且最好使用原始容器+维护线程安全性。

最佳答案

关于objective-c - 线程安全NSMutableDictionary,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39740426/

相关文章:

objective-c - NSMenu 以编程方式选择项目

ios - 为什么 NSJSONSerialization 将 NSDictionary 错误地解析为 JSON?

java - 为什么通常不推荐客户端锁定?

objective-c - 在 UITableView 中加载本地 json 信息

iphone - 如何为大型数据集创建 UITableView 索引

iphone - 我怎样才能换行 OHAttributedLabel

iphone - 在 Storyboard加载完成之前调用应用程序 didFinishLaunchingWithOptions?

java - 类锁定与 java 类加载器有关吗?

java - 正在捕获 Java Throwable 重新启动线程的最佳方法

objective-c - 按字典键的值对包含NSMutableDictionary的NSMutableArray进行排序