Daniele Andreoli
11/08/2021, 2:44 PMTom Wayne
11/08/2021, 2:56 PMTom Wayne
11/08/2021, 2:56 PMclass CommonFlow<T>(private val origin: Flow<T>) : Flow<T> by origin {
fun watch(block: (T) -> Unit): Closeable {
val job = Job()
onEach {
block(it)
}.launchIn(CoroutineScope(job + Dispatchers.Main))
return object : Closeable {
override fun close() {
job.cancel()
}
}
}
}
Tom Wayne
11/08/2021, 2:57 PMJohn O'Reilly
11/08/2021, 3:04 PMDaniele Andreoli
11/08/2021, 3:18 PMJohn O'Reilly
11/08/2021, 4:13 PMOsman Saral
11/09/2021, 11:03 AMexpect class CommonFlow<T>(origin: Flow<T>): Flow<T>
fun <T> Flow<T>.asCommonFlow(): CommonFlow<T> = CommonFlow(this)
//Android
actual class CommonFlow<T> actual constructor(origin: Flow<T>): Flow<T> by origin
//iOS
actual class CommonFlow<T> actual constructor(origin: Flow<T>): Flow<T> by origin {
val scope = MainScope(Dispatchers.Main)
fun observe(block: (T) -> Unit): Closeable {
onEach { block(it) }.launchIn(scope)
return object : Closeable {
override fun close() {
scope.cancel()
}
}
}
}
I will also add how we close the returned closeable from Swift side, so someone can tell me if I did something wrong ๐
. I'm not sure if I'm creating a retain cycle here :
public typealias Disposal = [Disposable]
extension Ktor_ioCloseable {
func add(to disposal: inout Disposal) {
let disposable = Disposable(self)
disposal.append(disposable)
}
}
public final class Disposable {
private let closable: Ktor_ioCloseable
init(_ closable: Ktor_ioCloseable) {
self.closable = closable
}
deinit {
print(":::deinit is calling")
closable.close()
}
public func add(to disposal: inout Disposal) {
disposal.append(self)
}
}
//on the call site
private var disposal = Disposal()
myFlow.observe { state in
///...
}.add(to: &disposal)
Bolu Okunaiya
11/16/2021, 5:35 PMOsman Saral
11/16/2021, 6:37 PM