0

次のように、複数のスレッドで何度も NSDictionary にアクセスして設定するコードがあります。

- (BOOL)flagForItem:(NSNumber*)itemID
{
    if(itemID) {
        return [[_itemFlagDict objectForKey:itemID] boolValue] 
    }
    return NO;
} 

と:

- (void)setFlagForItem:(NSNumber*)itemID
{
    if(itemID) {
        NSMutableDictionary *copy = [_itemFlagDict mutableCopy];
        [copy setObject:[NSNumber numberWithBool:YES] forKey:itemID];
        _itemFlagDict = [NSDictionary dictionaryWithDictionary:copy];
    }
}

set メソッドには、もともと NSMutableDictionary がありました。これは、今見ているパターンに変更されました。NSMutableDictionary はスレッドセーフではないためです。私の推論は、コピーでミューテーションを実行し_itemFlagDict、更新をキャプチャするために を再割り当てすることでした。

ただし、EXC_BAD_ACCESSにアクセスするとクラッシュが発生する場合が_itemFlagDictあり、objectForKey:itemID.

私が試したもう 1 つのアプローチは@synchronized(_itemFlagDict)、アクセサー メソッドとセッター メソッドの両方で使用することでした。これで問題は修正されましたが、このコードはパフォーマンスに敏感であり、アクセス/割り当てを同期するとパフォーマンスが大幅に低下しました。

私の質問は、パフォーマンスを犠牲にせずにこの悪いアクセスを回避するために使用できる他のパターン/方法はありますか? 優先順位付けが重要な場合は、アクセサー メソッドの実行 (鉄壁の精度である必要はありません) が最も重要です。

注:私はiOS 4以降で作業しています

4

2 に答える 2

0

私は同じ問題に遭遇しました。私の現在の解決策は、アトミック操作を使用してスレッドセーフな辞書を実装することです。あなたはそれをチェックアウトすることができます: https://github.com/bangquangvn/FastestThreadsafeDictionary-iOS

それが最速の解決策だと思います。

于 2016-09-01T08:13:11.137 に答える
0

読み取り/書き込みロックを試しましたか? get メソッドに複数のスレッドを、set メソッドに 1 つのライターを含めることができますhttps://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/pthread.3.html

于 2013-03-07T20:19:50.447 に答える