我寫的類SafeMutableDictionary繼承NSMutableDictionary。
類實現唯一的 「原始」 的方法,其must be inherits
從的NSDictionary:線程安全NSMutableDictionary
- (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的全碼回覆。
但不幸的是,我仍然得到崩潰,像
Collection <__NSDictionaryM: 0x16784ff0> was mutated while being enumerated.
所以錯誤,我有一些問題:
1)我的實現是正確的?我錯過了什麼?
2)是否存在更多着名和經過測試的解決方案?
3)從main和bg線程同時訪問容器的最佳實踐是什麼?
可能是做這樣的繼承最糟糕的做法,更好地利用原來的容器+護理線程安全的
忘掉'@ synchronized'。只需在串行隊列中處理你的字典。 –