比方說,我們有一個核心數據實體Image
,其中有一個屬性url
存儲文件系統的URL到實際的圖像文件。我們可以實現刪除功能是這樣的:原子刪除數據庫實體和文件
func deleteImage(_ image: Image) {
do {
let url = image.url
delete(image)
try save()
try FileManager.default.removeItem(at: url)
} catch {
rollback()
}
}
- 如果同時
save()
和removeItem(at:)
的成功,操作成功。 - 如果
save()
失敗,數據庫將回滾到其原始狀態。 - 但是,如果
save()
成功,但removeItem(at:)
失敗,孤立文件將留在文件系統中。
有沒有一種方法,使deleteImage()
原子,而不涉及一個單獨的進程檢查,並定期刪除孤立文件?
-
它可以使用isDeletableFile(atPath:)
,但仍然不是100%可靠。
func isDeletableFile(atPath path: String) -> Bool
試圖基於所述文件系統或文件系統中的特定文件的當前狀態的謂詞行爲不推薦。這樣做會造成奇怪的行爲或競賽狀況。嘗試一個操作(例如加載文件或創建目錄),檢查錯誤並妥善處理這些錯誤要比試圖提前弄清操作是否成功要好得多。
爲什麼在刪除之前要保存一些東西?無論如何,你可以使用「guard」作爲save(): guard try save()else { throw throw throw here 然後嘗試刪除一個圖像 – Woof
核心數據需要你調用save()實際上從數據庫中刪除實體。另外使用'guard'也不利於情況3。 –