3

所以我有一个交互器,它使用 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(太矫枉过正了 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)
                        }
                    })

哪个有效,但太冗长了。

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

4

1 回答 1

5

您可以创建一个通用方法来执行一次运行侦听器。类似于以下内容:

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)
             }
         }
    }
}
于 2016-06-28T13:11:19.110 回答