У меня есть вопрос о безопасности потоков в следующем примере кода от 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;
}
}];
Так почему другой стиль, и он на один более правильный, чем другой?