Skip to content

Instantly share code, notes, and snippets.

@ZalyalovIldar
Created February 26, 2019 10:51
Show Gist options
  • Save ZalyalovIldar/754f3f4d1c2f9c6511373112b8de5d11 to your computer and use it in GitHub Desktop.
Save ZalyalovIldar/754f3f4d1c2f9c6511373112b8de5d11 to your computer and use it in GitHub Desktop.
Realm Cascade delete
/// Cascade delete object in Realm
///
/// - warning: Call only in write transaction
/// - Parameters:
/// - object: Object to delete
/// - realm: Realm instance
/// - onlyProperties: removeOnly property (ex. before re-write/update model)
func cascadeDelete(_ object: Object, with realm: Realm, onlyProperties: Bool = false) {
guard !object.isInvalidated else { return }
for property in object.objectSchema.properties {
cascadeDelete(valueForKey: property.name, for: object, in: realm)
}
if !onlyProperties {
realm.delete(object)
}
}
/// Cascade delete by key path of model in Realm
///
/// - warning: Call only in write transaction
/// - Parameters:
/// - key: key path of property
/// - object: Object model
/// - realm: Realm instance
func cascadeDelete(valueForKey key: String, for object: Object, in realm: Realm) {
guard let value = object.value(forKey: key) else { return }
if let object = value as? Object {
cascadeDelete(object, with: realm)
}
if let list = value as? List<Object> {
list.forEach { cascadeDelete($0, with: realm) }
}
}
//----Usage-------
// realm - current realm instance
// realmModels - array of Objects - [Object]
// User - Realm object
///Cascade delete of object
try! realm.write({
realmModels.forEach{ cascadeDelete($0, with: realm) }
})
///Cascade delete of object's property
try! realm.write({
realmModels.forEach{ cascadeDelete(#keyPath(User.childObject), forObject: $0, in: realm) }
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment