Изменение изменяемый объект в обработчике завершения

У меня есть вопрос о безопасности потоков в следующем примере кода от Apple (из руководства по программированию GameKit)

Это для загрузки достижений из игрового центра и их локального сохранения:

Шаг 1) Добавьте изменяемое свойство словаря в ваш класс, который сообщает о достижениях. Этот словарь хранит коллекцию объектов достижений.

@property(nonatomic, retain) NSMutableDictionary *achievementsDictionary;

Шаг 2) Инициализируйте словарь достижений.

achievementsDictionary = [[NSMutableDictionary alloc] init];

Шаг 3) Измените код, который загружает данные достижений, чтобы добавить объекты достижений в словарь.

{
    [GKAchievement loadAchievementsWithCompletionHandler:^(NSArray *achievements, NSError *error)
        {
            if (error == nil)
            {
                for (GKAchievement* achievement in achievements)
                    [achievementsDictionary setObject: achievement forKey: achievement.identifier];
            }
        }];

Мой вопрос: следует - объект achievementDictionary модифицируется в обработчике завершения без каких-либо блокировок сортировки. Разрешено ли это, потому что обработчики завершения - это блок работы, который будет гарантированно выполняться iOS как блок в основном потоке? И никогда не сталкивались с проблемами безопасности потоков?

В другом примере кода Apple (GKTapper) эта часть обрабатывается по-другому:

@property (retain) NSMutableDictionary* earnedAchievementCache; // note this is atomic

Затем в обработчике:

[GKAchievement loadAchievementsWithCompletionHandler: ^(NSArray *scores, NSError *error)
        {
            if(error == NULL)
            {
                NSMutableDictionary* tempCache= [NSMutableDictionary dictionaryWithCapacity: [scores count]];
                for (GKAchievement* score in scores)
                {
                    [tempCache setObject: score forKey: score.identifier];
                }
                self.earnedAchievementCache= tempCache;
            }
        }];

Так почему другой стиль, и он на один более правильный, чем другой?

6
задан Sean S Lee 1 October 2011 в 01:37
поделиться