我写的类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/