我正在编写一个为我配置一些 UserDefaults 值的实用程序,例如用于根据我的个人喜好初始化新的 Mac。
它从输入文件中读取一组配置。CFPreferencesSetValue
然后,它使用API将指定的首选项应用于各种应用程序。我使用它而不是NSUserDefaults
,因为后者不允许您写入NSGlobalDomain
( /Library/Preferences/.GlobalPreferences.plist
)。
它工作得很好,但有一个转折点:我希望能够检测哪些应用程序的偏好值实际上发生了变化,哪些应用程序已经有了所需的偏好。这允许我仅在必要时自动重新启动“脏”应用程序,例如 Finder、Dock 等。
我通过这样做来实现这一点:
- 读取现有偏好的值
- 将刚刚读取的值与从配置文件中读取的所需值进行比较
- 记下哪些域的值需要更改
- 应用首选项更改
- 重启脏域对应的应用。
问题是我有一个最后写入获胜的场景。如果没有任何类型的事务/锁定机制,完全有可能有人会在我脚下更改偏好,而我会覆盖他们的更改。如果我只是更改我自己的应用程序的首选项,这不会是一个问题,但鉴于我将要更改NSGlobalDomain
(这是相对较高的“流量”),这是一个等待中的错误。
有没有办法安全地进行此更改,而不会有最后写入获胜破坏其他更改的风险?