gpt4 book ai didi

ios - NSUserDefaults 线程在 IOS 上的扩展之间共享数据是否安全?

转载 作者:可可西里 更新时间:2023-11-01 05:34:12 33 4
gpt4 key购买 nike

“与包含的应用程序共享数据”下的应用程序扩展文档使用 NSUserDefaults 来执行此操作,并进一步写了一点

"to avoid data corruption, you must synchronize data accesses. Use Core Data, SQLite, or >Posix locks to help coordinate data access in a shared container."

但是当我查看 NSUserDefaults 的文档时说

"The NSUserDefaults class is thread-safe."

那么在我的扩展程序和容器应用程序之间使用 NSUserDefaults 时,我是否需要使用某种锁?

最佳答案

线程安全是指从一个线程更改内存中数据结构的能力,不会损害其他线程查看或更改这些结构的能力。当您使用 NSUserDefaults 在应用扩展与其包含的应用之间共享数据时,您并不是在多个线程之间共享内存中的数据,而是在磁盘上共享多个进程之间的数据,因此线程安全的讨论不适用。

NSUserDefaults synchronize 的文档并没有明确说明,但几乎可以肯定地假设它使用原子文件写入——也就是说,没有危险一个进程读取已由另一个进程部分写入的文件。如果您担心在您的应用写入默认值和您的扩展程序读取它们(反之亦然)之间的竞争条件或其他计时问题,请确保在重要写入之后和重要读取之前立即同步 .

关于数据损坏的评论适用于普通文件读/写操作——天真地在两个进程中读取或写入文件可能会导致数据损坏,因为一个进程可能读取部分写入的文件或部分覆盖文件内容。如果您直接执行自己的文件 I/O,则需要某种协调机制(如 NSFileCoordinator,但请注意它只能在 iOS 应用程序/扩展程序之间正常工作 in iOS 8.2 and newer )。或者您可以使用更高级别的实用程序来进行自己的协调,例如 CFPreferences/NSUserDefaults、SQLite、Core Data 或 Posix 文件锁。

TLDR:是的,您可以安全地使用 NSUserDefaults 在扩展程序及其包含的应用程序之间共享。只要按照建议in Apple's app extensions guide .

关于ios - NSUserDefaults 线程在 IOS 上的扩展之间共享数据是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26323454/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com