joh*_*crq 3 sam listener kotlin
所以我有一个交互器,它使用 Realm 执行插入操作,然后通过 RealChangeListener 通知插入已完成。它是这样的:
fun insertCar(item: Car) {
realm.doInTransaction {
val car = Car(...)
val copy = copyToRealm(car)
copy.addChangeListener(...)
}
}
Run Code Online (Sandbox Code Playgroud)
我可以这样做:
fun insertCar(item: Car, listener: RealmChangeListener<Car>) {
realm.doInTransaction {
val car = Car(...)
val copy = copyToRealm(car)
copy.addChangeListener(listener)
}
}
Run Code Online (Sandbox Code Playgroud)
并像这样访问:
realmInteractor.insertCar(item, RealmChangeListener {
// do something here
})
Run Code Online (Sandbox Code Playgroud)
但后来我无法删除这个听众
realmInteractor.insertCar(item, RealmChangeListener {
// do something here
it.removeChangeListener(this)
})
Run Code Online (Sandbox Code Playgroud)
this 将指向它所在的类而不是实际的侦听器
我也可以这样做:
fun insertCar(item: Car, doAfterChange (Car) -> Unit) {
realm.doInTransaction {
val car = Car(...)
val copy = copyToRealm(car)
copy.addChangeListener(RealmChangeListener{
doAfterChange()
})
}
}
Run Code Online (Sandbox Code Playgroud)
但后来我在另一个 SAM 中有一个 SAM(太矫枉过正了)
我可以这样做:
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)
}
})
Run Code Online (Sandbox Code Playgroud)
哪个有效,但它太冗长了。
那么你如何处理这个问题,什么被认为是最好的方法?
您可以创建一个通用方法来执行一次运行侦听器。类似的东西:
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)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1651 次 |
| 最近记录: |