- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个简单的应用程序,它使用应用程序文档文件夹中的 NSCoding
存储自定义类型的数组(名为 Drug
的类的实例)。
加载和保存代码是对我的主视图 Controller 的扩展,一旦加载它就一直存在。
数组的初始化:
var drugs = [Drug]()
此数组随后会附加下面 loadDrugs()
方法的结果。
func saveDrugs() {
// Save to app container
let isSuccessfulSave = NSKeyedArchiver.archiveRootObject(drugs, toFile: Drug.ArchiveURL.path)
// Save to shared container (for iMessage, Spotlight, widget)
let isSuccessfulSaveToSharedContainer = NSKeyedArchiver.archiveRootObject(drugs, toFile: Drug.SharedArchiveURL.path)
}
这是加载数据的代码。
func loadDrugs() -> [Drug]? {
var appContainerDrugs = NSKeyedUnarchiver.unarchiveObject(withFile: Drug.ArchiveURL.path) as? [Drug]
return appContainerDrugs
}
数据也使用 CloudKit 存储在 iCloud 中,应用程序可以响应 CK 通知以从另一台设备获取更改。后台提取也会触发相同的方法。
// App Delegate
func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
// Code to get reference to my main view controller
// This will have called loadDrugs() to populate local array drugs of type [Drug]
mainVC.getZoneChanges()
}
最后,还有 getZoneChanges()
方法,它使用存储的 CKServerChangeToken
通过 CKFetchRecordZoneChangesOperation
从私有(private)用户数据库获取更改.完成 block 调用 saveDrugs()
。
所有这些似乎都运行良好。但是,有时所有本地数据都会在应用程序的使用之间消失,尤其是在一段时间未使用的情况下。谢天谢地,删除并重新安装该应用确实会从 iCloud 中提取备份数据。
如果应用有一段时间没有使用(可能被系统终止),似乎会发生这种情况。有些东西必须改变,所以我认为当应用程序终止时调用后台提取可能是问题所在。调试时以及应用最近处于前台时一切正常。
我猜问题是我依赖后台获取(或接收 CK 通知)在后台加载我的主视图 Controller ,然后加载保存的本地数据。
我听说 UserDefaults
在后台无法正常工作,在这种情况下可能存在文件安全保护以防止访问文档目录。如果是这种情况,我可能会加载一个空数组(或者更确切地说是初始化数组而不是将数据附加到它)然后保存它,覆盖现有数据,所有这些都在用户不知情的情况下进行。
如何避免这个问题?有没有办法检查数据是否正确加载?如果出现问题,我尝试使用 fatal error 进行条件加载,但这会导致应用程序首次运行时出现问题,因为无论如何都没有数据!
编辑
存档 URL 是动态获取的,如下所示。我只是在我的主数据模型类 (Drug
) 中使用静态方法来访问它们:
static let DocumentsDirectory = FileManager().urls(for: .documentDirectory, in: .userDomainMask).first!
static let ArchiveURL = DocumentsDirectory.appendingPathComponent("drugs")
最佳答案
此类问题的最常见原因是当设备被锁定且 protected 数据被加密时在后台被唤醒。
作为起点,您可以检查 UIApplication.isProtectedDataAvailable
以验证 protected 数据是否可用。您还可以将所需数据的保护级别降低到 .completeUntilFirstUserAuthentication
(具体操作取决于您创建文件的方式)。
通常,您应该尽量减少敏感信息的数据保护级别,因此通常最好在设备锁定时写入其他位置,然后在设备解锁后合并该位置。
关于ios - 后台获取间歇性数据丢失 - NSKeyedUnarchiver 可以从文档目录返回 nil 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57758330/
我正在为我的程序编写安装脚本,它应该在 Linux/Unix 操作系统上运行。以下文件的默认目录是什么: 可执行文件(程序)。程序应通过从命令行键入其名称来执行。 共享库。 第三方共享库(程序未开源,
我有一堆用户、组和应用程序注册,我的 MVC 应用程序使用 AAD 数据进行身份验证和授权。是否可以将 Azure Active Directory 从一个租户(目录)迁移到另一个租户(目录)?如果可
查看 cljsbuild 文档 https://github.com/emezeske/lein-cljsbuild :cljsbuild { :builds [{ ; The
忽略已经版本控制的文件 如果你不小心添加了一些应该被忽略的文件,你如何将它们从版本控制中去除而不会丢失它们?或许你有自己的IDE配置文件,不是项目的一部分,但将会花费很多时间使之按照自己的方式工作。
我想使用\tableofcontents 命令,但没有目录从新页面开始或在末尾创建新页面,并且所有内容都是单倍行距。我怎样才能做到这一点?我假设使用 tocloft,但有哪些选择? 谢谢 最佳答案 试
我有一些 javascript 菜单代码,可以在单独的目录中正常工作。但是,当我尝试从同一目录中调用相同的 .js 文件时,它不会看到这些文件。 以下内容来自另一个目录: script type="t
我有这样的路径: /my/path/to/important_folder 在同一级别上,我还有其他文件和文件夹想要在达到与 important_folder 相同的级别时列出。 我的文件夹可能更深,
1、获取文件路径实现 1.1 获取当前文件路径 ? 1
我正在使用最新版本的 NTEmacs。 我写了一个名为“.dir-locals.el”的文件,如下所示。 ((nil . ((tab-width . 8) (fill-column .
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
在我的 .vimrc 中有这些行 :set foldmethod=marker :set foldmarker=SECTION:,ENDSECTION: 用于自定义代码折叠。在我的文件中,相关语言的注
在 fish 中: for x in * echo $x end *这里包括所有目录和文件,如何只列出文件(或目录)? 最佳答案 fish 没有很多花哨的通配语法。但是,目录可以像这样迭代: f
这是我的目录结构: ├── src │ ├── helpers │ │ ├── __init__.py │ │ ├── foo.py │ │ └── bar.py │
我想递归重命名文件夹/目录名称并找到 this solution所以。但是这个命令没有效果 find . -type f -exec rename 's/old/new/' '{}' \; 这是一个正
我想在相册中创建一个文件夹,并希望将图像保存在创建的相册中。 这可能吗?有什么办法可以做到这一点吗? 我已经搜索过,大多数人都说这是不可能的。 感谢您的帮助。 最佳答案 您也许可以使用AssetsLi
如何在python中使用用户定义的名称创建临时文件/目录。我知道 tempfile .但是我看不到任何以文件名作为参数的函数。 注意:我需要这个来对包含临时文件的临时目录上的 glob(文件名模式匹配
我在项目中使用JaCoCo Gradle插件。 作为问题的一个示例,我的大部分代码都在com.me.mysoftware包下。 我正在使用代码生成器来生成build/generated/java/..
我正在尝试使用 Gradle 开始运行 jar 文件 我的任务如下所示: task startServer(type: Exec) { workingDir file("${buildDir}/a
如何在 Ant 中定义一个目录集,其中包括两个目录:项目的基目录和子目录“test”? 看起来您无法使用“/”、“.”或“”专门包含目录集的根目录。例如,这包括“./test”,但不包括“.”:
我正在使用 CTAGs 包,它使用 Sublime Text 2 生成两个文件 .tags 和 .tags_sorted_by_file。 那么当我进行项目搜索(CMD + SHIFT + F)时,如
我是一名优秀的程序员,十分优秀!