Kotlin建议使用SAM取消注册侦听器的方法 [英] Kotlin recommended way of unregistering a listener with a SAM
问题描述
所以我有一个交互器,该交互器使用Realm执行插入操作,然后通过RealChangeListener通知插入已完成.是这样的:
So i have an interactor which performs an insert operation with Realm and then notifies that the insertion is completed with a RealChangeListener. It is something like this:
fun insertCar(item: Car) {
realm.doInTransaction {
val car = Car(...)
val copy = copyToRealm(car)
copy.addChangeListener(...)
}
}
我可以这样:
fun insertCar(item: Car, listener: RealmChangeListener<Car>) {
realm.doInTransaction {
val car = Car(...)
val copy = copyToRealm(car)
copy.addChangeListener(listener)
}
}
并像这样访问:
realmInteractor.insertCar(item, RealmChangeListener {
// do something here
})
但是后来我无法删除此监听器
But then i have no way of removing this listener
realmInteractor.insertCar(item, RealmChangeListener {
// do something here
it.removeChangeListener(this)
})
this
将指向其所在的类而不是实际的侦听器
this
will point to the class its located not the actual listener
我也可以这样做:
fun insertCar(item: Car, doAfterChange (Car) -> Unit) {
realm.doInTransaction {
val car = Car(...)
val copy = copyToRealm(car)
copy.addChangeListener(RealmChangeListener{
doAfterChange()
})
}
}
但是然后我在另一个SAM中有一个SAM(太杀了imo)
But then i have a SAM inside another SAM (too overkill imo)
我可以这样:
fun insertCar(item: Car, listener: RealmChangeListener<Car>) {
realm.doInTransaction {
val car = Car(...)
val copy = copyToRealm(car)
copy.addChangeListener(listener)
}
}
realmInteractor.insertCar(item, object : RealmChangeListener<Car> {
override fun onChange(element: Car?) {
...
element?.removeChangeListener(this)
}
})
哪个有用,但是太冗长了.
Which works but it is too verbose.
那么您如何处理这个问题?什么是最好的方法?
So how do you deal with this and what is considered the best approach?
推荐答案
您可以创建一个通用方法来执行一次运行的侦听器.类似于以下内容:
You can create a generic method to perform a run-once listener. Something along the lines of:
fun <T> createInRealm(objectFactory: () -> T, changeListener: (T) -> Unit) {
realm.doInTransaction {
val obj = objectFactory()
val copy = copyToRealm(obj)
copy.addChangeListener(object : RealmChangeListener<T> {
override fun onChange(element: T) {
changeListener()
element.removeChangeListener(this)
}
}
}
}
这篇关于Kotlin建议使用SAM取消注册侦听器的方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!