是否有一種簡單的方法可以保存 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 串列做錯了事情。
這些問題僅出現在實際設備上。模擬器的路徑是穩定的,至少直到模擬器決定重置其狀態的任意時間。
uj5u.com熱心網友回復:
我認為這bookmarkData就是您可能正在尋找的。檔案沒有說太多,但總體思路是您使用此方法保留書簽資料
func bookmarkData(
options: URL.BookmarkCreationOptions = [],
includingResourceValuesForKeys keys: Set<URLResourceKey>? = nil,
relativeTo url: URL? = nil
) throws -> Data
然后使用此初始化程式重新創建 URL :
init(
resolvingBookmarkData data: Data,
options: URL.BookmarkResolutionOptions = [],
relativeTo url: URL? = nil,
bookmarkDataIsStale: inout Bool
) throws
就我個人而言,我沒有遇到任何問題,因為我參考的是目錄而不是單個檔案,但發現了警示文章(比如這篇文章) - 參考它的結論:
URL書簽規則
- 始終檢查書簽資料是否過時 (bookmarkDataIsStale)
- 如果資料過時,請更新所有書簽資料 - 包括可能存盤在其他地方的所有書簽。
- 小心原子更新 - 需要紀律才能不使用它。
- 如果需要持久性和原子寫入更好地使用其他東西 - 每次保存后更新存盤的書簽很麻煩且容易出錯。
uj5u.com熱心網友回復:
您可以檢查哪一個是最后修改的:
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/533086.html
