gpt4 book ai didi

listener - Kotlin 推荐的使用 SAM 注销监听器的方法

转载 作者:行者123 更新时间:2023-12-02 12:39:57 27 4
gpt4 key购买 nike

所以我有一个交互器,它使用 Realm 执行插入操作,然后使用 RealChangeListener 通知插入已完成。它是这样的:

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
})

但是我没有办法删除这个监听器

realmInteractor.insertCar(item, RealmChangeListener {
// do something here
it.removeChangeListener(this)
})

this 将指向它所在的类而不是实际的监听器

我也可以这样做:

fun insertCar(item: Car, doAfterChange (Car) -> Unit) {
realm.doInTransaction {
val car = Car(...)
val copy = copyToRealm(car)
copy.addChangeListener(RealmChangeListener{
doAfterChange()
})
}
}

但是我在另一个 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)
}
})

哪个有效,但是太冗长了。

那么您如何处理这个问题以及什么被认为是最好的方法?

最佳答案

您可以创建一个通用方法来执行一次运行的监听器。类似的东西:

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)
}
}
}
}

关于listener - Kotlin 推荐的使用 SAM 注销监听器的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38074356/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com