如何使字典 NSDictionary 成为阅读、插入的线程安全?

Posted

技术标签:

【中文标题】如何使字典 NSDictionary 成为阅读、插入的线程安全?【英文标题】:How to make dictionary NSDictionary be thread safe for reading, inserting? 【发布时间】:2015-01-10 12:59:34 【问题描述】:

在应用程序的每次启动时,我都必须从服务器获取几个 .plist,然后我在代码中使用其中的一些(取决于用户的选择)。为了避免加载非常.plist,我在进入应用程序时下载所有并将每个解析到字典中,并将它们全部放入缓存字典中(键是plist名称,值是plist解析成字典)。如何使字典( NSDictionary 或使用其他东西)在阅读、插入时是线程安全的?

【问题讨论】:

您需要某种围绕字典访问的锁定/同步机制,但请注意,该机制还必须以某种方式确保您指定的任何键值在操作期间是不变的。 (如果您使用不可变字符串作为键,这不是问题,但如果您使用其他类型的键,您可能会遇到问题。) (但请注意,如果您确保字典在实践中在所有可能同时访问的情况下都是“只读”的,则无需同步。) (虽然我看到 NSDictionary “通常被认为是线程安全的”。所以大概只有可变键的问题会受到关注。) 【参考方案1】:

您可以在每次访问共享对象时使用@synchronized。我建议构建一个用于访问的包装器对象,这样您就不会意外忘记在代码中的某个位置进行同步。

@synchronized 
    NSString* settingValue = self.sharedDictionary[@"key"];

这是一种语言功能,可以翻译为独占互斥体。如果您需要对同步方式进行更多控制,则应使用提供的其他同步原语之一。 Apple 在他们的Threading Programming Guide 中有一个很好的概述。

【讨论】:

以上是关于如何使字典 NSDictionary 成为阅读、插入的线程安全?的主要内容,如果未能解决你的问题,请参考以下文章

排序 NSDictionary

如何将字典的 NSDictionary 添加到 NSArray?

如何检查 NSDictionary 中的值是不是存在于字典数组中

如何将它们添加到字典中,并在python中每5个循环后使活动变量成为结尾?

如何从 NSDictionary 中删除对象

如何使用 NSManagedObject 将 NSDictionary 保存到 CoreData?