swift 在iOS上存储“最近使用”文稿列表的最佳策略是什么?

c9x0cxw0  于 2022-11-21  发布在  Swift
关注(0)|答案(2)|浏览(153)

是否有一种简单的方法来保存UIDocument的URL,以便应用程序可以在下次启动时继续编辑该文档?
我尝试过各种保存URL的方法,但有时文档URL会与预期略有不同。
例如,下列程式码:

var scoresURL = FileManager.default.urls(for: .documentDirectory,
                                             in: .userDomainMask).first!

可能会传回:

file:///var/mobile/Containers/Data/Application/50E947C1-7A30-40A0-8BB6-1C3BB41A1218/Documents

但是,使用UIDocumentBrowserViewController载入的文件可能会将UIDocument的fileURL路径设定为:

file:///private/var/mobile/Containers/Data/Application/50E947C1-7A30-40A0-8BB6-1C3BB41A1218/Documents

正是这些细微的差异让我怀疑我维护MRU列表是不是做错了事。
这些问题只出现在实际设备上。模拟器是路径稳定的,至少在模拟器决定重置其状态的任意时间之前是稳定的。

7kqas0il

7kqas0il1#

我认为bookmarkData就是您要找的。文档没有说太多,但总体思路是持久化书签数据using this method

func bookmarkData(
    options: URL.BookmarkCreationOptions = [],
    includingResourceValuesForKeys keys: Set<URLResourceKey>? = nil,
    relativeTo url: URL? = nil
) throws -> Data

然后使用this initializer

init(
    resolvingBookmarkData data: Data,
    options: URL.BookmarkResolutionOptions = [],
    relativeTo url: URL? = nil,
    bookmarkDataIsStale: inout Bool
) throws

就我个人而言,我没有遇到任何问题,因为我引用的是目录而不是单个文件,但我发现了一些警告文章(like this one)--引用它的结论:
URL书签规则

  • 始终检查书签数据是否过时(bookmarkDataIsStale)
  • 如果数据过时,则更新所有书签数据-包括可能存储在其他地方的所有书签。
  • 小心原子更新-需要纪律不要使用它。
  • 如果需要持久性和原子写入,最好使用其他方法--每次保存后更新存储的书签既麻烦又容易出错。
7gyucuyw

7gyucuyw2#

您可以检查哪一个是最后修改的:

var scoresURL = FileManager.default.urls(for: .documentDirectory,
                                             in: .userDomainMask)

let modificationDatesAndURL: (Date, URL) = scoresURL.compactMap { filePathURL in
    let attributes = FileManager.default.attributesOfItem(atPath: urlPath.path)
    if let modificationDate = attributes?[.modificationDate] as? Date {
        return (modificationDate, filePathURL)
    } else {
        return nil
    }
    
}

/// Sort tuples by date
let lastModifiedScoreDateAndURL = modificationDatesAndURL.sorted(by: { $0.0 < $1.0 }).first
let lastModifiedURL = lastModifiedScoreDateAndURL.1

相关问题