は、我々は実際の画像ファイルにファイルシステムのURLを保存するプロパティurl
を持っているコアデータのエンティティImage
を、持っているとしましょう。私たちは、このように削除機能を実装することができます:save()
とremoveItem(at:)
の両方が成功している原子的に削除データベース・エンティティとファイル
func deleteImage(_ image: Image) {
do {
let url = image.url
delete(image)
try save()
try FileManager.default.removeItem(at: url)
} catch {
rollback()
}
}
- 場合、操作は成功です。
save()
に失敗した場合、データベースは元の状態にロールバックされます。- ただし、
save()
は成功しましたが、removeItem(at:)
に失敗した場合、孤児ファイルはファイルシステムに残されます。
別のプロセスのチェックを含む、定期的に孤立ファイルを削除せず、deleteImage()
はアトミックにする方法はありますか?
-
100%の信頼性isDeletableFile(atPath:)
を使用することが可能であるが、それでもません。ファイル・システムまたはファイルシステム上の特定のファイルの現在の状態に基づいて動作を述語しよう
func isDeletableFile(atPath path: String) -> Bool
推奨されません。そうすると、奇妙な動作や競合状態が発生する可能性があります。 (ファイルのロードやディレクトリの作成などの)操作を試み、エラーをチェックし、エラーが正常に処理されるようにするのは、操作が成功するかどうかを事前に把握するよりもはるかに優れています。
なぜ削除する前に何かを保存しようとしていますか?とにかく、save()に "guard"を使うことができます: guard try save()else { "ここでエラーを投げます" } – Woof
コアデータは 'save()'を呼び出す必要があります。データベースから実際にエンティティを削除します。また、 'guard 'を使うことは状況3を助けません。 –