CoreDataのデータを全部削除する時って、以下のようなコードで行ってました。(エラー処理は省略してます)
fetchして削除
1 2 3 4 5 6 7 |
Let query = Tag.fetchRequest() let results = try? managedObjectContext.fetch(query) for tag in results { managedObjectContext.delete(tag) } |
もちろん、動作としては、期待する動作になっているのですが、動作の内容を考えると、一度、データベースからメモリ上に読み込んで削除して、それをデータベースに反映するという動作をしているんですよね。少しもったいないですよね。
iOSだとiOS9から、MacOSだとMacOS10.11以降に、NSBatchDeleteRequestという削除をバッチで行うためのクラスが実装されてました。
以下のような形で使うことができます。
バッチ削除
動作的には、こちらの方が早いです。
1 2 3 4 5 6 7 8 |
viewContext.performAndWait { let fetchReq = Tag.fetchRequest() let delReq = NSBatchDeleteRequest(fetchRequest: fetchReq) try? managedObjectContext.execute(delReq) } } |
バッチ処理向けには、NSBatchDeleteRequestの他に、NSBatchUpdateRequestがあります。
Sponsor Link