【发布时间】:2011-08-16 22:08:14
【问题描述】:
我对来自 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];
}
}];
我的问题如下-成就字典对象正在完成处理程序中被修改,没有任何排序锁。这是否允许,因为完成处理程序是 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;
}
}];
那么为什么会有不同的风格,一种方式比另一种更正确?
【问题讨论】:
标签: ios thread-safety gamekit objective-c-blocks