use*_*499 5 multithreading shared ios ios-app-group
“与包含的应用程序共享数据”下的应用程序扩展文档使用 NSUserDefaults 来执行此操作,并进一步写一下
“为了避免数据损坏,您必须同步数据访问。使用 Core Data、SQLite 或 >Posix 锁来帮助协调共享容器中的数据访问。”
但是当我查看 NSUserDefaults 的文档时说
“NSUserDefaults 类是线程安全的。”
那么,在我的扩展程序和容器应用程序之间使用 NSUserDefaults 时,我是否需要使用某种锁?
线程安全是指从一个线程更改内存数据结构的能力,而不会损害其他线程查看或更改这些结构的能力。当您用于在NSUserDefaults应用程序扩展与其包含的应用程序之间共享数据时,您不是在多个线程之间共享内存中的数据,而是在多个进程之间共享磁盘上的数据,因此线程安全的讨论不适用。
的文档NSUserDefaults synchronize并没有明确说明,但几乎可以肯定地假设它使用原子文件写入 \xe2\x80\x94 ,也就是说,一个进程读取已被写入的文件时不存在危险。部分由另一个进程写入。如果您担心应用程序写入默认值和扩展程序读取默认值之间的竞争条件或其他计时问题(反之亦然),请确保在synchronize重要写入之后和重要读取之前立即进行。
关于数据损坏的注释适用于纯文件读/写操作 \xe2\x80\x94 在两个进程中天真地读取或写入文件可能会导致数据损坏,因为一个进程可能会读取部分写入的文件或部分覆盖文件内容。如果您直接执行自己的文件 I/O,则需要某种协调机制(例如,但要注意,它只能在 iOS 8.2 及更高版本中的NSFileCoordinatoriOS 应用程序/扩展之间正常工作)。或者您可以使用更高级别的实用程序来进行自己的协调,例如/ 、SQLite、Core Data 或 Posix 文件锁。CFPreferencesNSUserDefaults
TLDR:是的,您可以安全地NSUserDefaults在扩展程序及其包含的应用程序之间进行共享。只需遵循Apple 应用程序扩展指南 中的建议即可。
该文档并不太清楚,因为它使用NSUserDefaults作为共享数据的一种方式的主要示例,但也涵盖了其他选项,没有太多停顿。您应该足够安全,NSUserDefaults无需先尝试获取锁定即可使用,我一直在使用它构建 Today 扩展,并且没有遇到数据损坏的问题。不过,我在每次写入后都会调用synchronize,只是为了确保立即存储数据。
| 归档时间: |
|
| 查看次数: |
3033 次 |
| 最近记录: |