Kotlin建议使用SAM取消注册侦听器的方法 [英] Kotlin recommended way of unregistering a listener with a SAM

查看:117
本文介绍了Kotlin建议使用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆