ursus
06/19/2019, 12:06 AMgildor
06/19/2019, 12:18 AMursus
06/19/2019, 12:24 AMgildor
06/19/2019, 12:29 AMursus
06/19/2019, 12:30 AMgildor
06/19/2019, 12:30 AMursus
06/19/2019, 12:30 AMprivate val someObservablesMap = hashMap<String, Observable<SomeResult>>
fun someObservable(someId: String) : Observable<SomeResult> {
val obs = someObservable.getOrPut(someId) {
Observable.fromCallable or whatever
}
return obs
}
someObservable("abc")
.subscribe {}
gildor
06/19/2019, 12:33 AMursus
06/19/2019, 12:33 AMclass SomeManager {
private val someObservablesMap = hashMap<String, Observable<SomeResult>>
fun someObservable(someId: String) : Observable<SomeResult> {
val obs = someObservable.getOrPut(someId) {
Observable.fromCallable or whatever
.refCount()
}
return obs
}
}
call site
someObservable("abc")
.subscribe {}
gildor
06/19/2019, 12:34 AMursus
06/19/2019, 12:36 AMgildor
06/19/2019, 12:36 AMursus
06/19/2019, 12:36 AMgildor
06/19/2019, 12:37 AMursus
06/19/2019, 12:38 AMHashMap<String, suspend () -> SomeResult>
what would be that lamba? I dont followgildor
06/19/2019, 12:38 AMursus
06/19/2019, 12:38 AMgildor
06/19/2019, 12:39 AMursus
06/19/2019, 12:39 AMgildor
06/19/2019, 12:40 AMursus
06/19/2019, 12:40 AMgildor
06/19/2019, 12:40 AMursus
06/19/2019, 12:41 AMgildor
06/19/2019, 12:41 AMasync {}
it will just cache result in Defferedursus
06/19/2019, 12:42 AMgildor
06/19/2019, 12:43 AMursus
06/19/2019, 12:46 AMsuspend fun postMessage(someText: String) {
val requestUuid = createUuiFromText(someText)
channels.getOrPut(requestUuid) { Channel() }
// insert to database
channels[requestUuid].send(State.SENDING)
// apiClient.actuallySend
channels[requestUuid].send(State.SENT)
}
gildor
06/19/2019, 1:14 AMprivate val someObservablesMap = hashMap<String, BroadcastChannel<SomeResult>>
fun someChannel(someId: String) : ReceiveChannel<SomeResult> {
val obs = someObservable.getOrPut(someId) {
BroadcastChannel or whatever
}
return obs.openSubscription() // or asFlow()
}
someChannel("abc")
.consumeEach {}
refcount()
feature to unsubscribe, only publish()
to broadcast valuebservable.fromCallable or whatever.refCount()
should doursus
06/19/2019, 1:20 AMgildor
06/19/2019, 1:22 AMursus
06/19/2019, 1:24 AMclass MessageManager {
private val observablesMap = hashMap<String, Observable<Unit>>
fun postMessageObservable(someText: String) : Observable<Unit> {
val key = sha1(someText)
val obs = someObservable.getOrPut(key) {
Observable.fromCallable {
// insert message to db with MessageState.SENDING
// apiClient.sendMessage(..)
// update message to db with MessageState.SENT
}
.publish()
.autoConnect()
}
return obs
}
}
gildor
06/19/2019, 1:25 AMObservable.fromCallable {}.refCount()
is not valid codeursus
06/19/2019, 1:26 AMgildor
06/19/2019, 1:26 AMursus
06/19/2019, 1:26 AMgildor
06/19/2019, 1:30 AMpublish is not defined on SingleExactly
ursus
06/19/2019, 1:30 AMgildor
06/19/2019, 1:35 AMclass MessageManager {
private val observablesMap = hashMapOf<String, Deferred<Unit>>()
fun postMessageObservable(someText: String) : Deferred<Unit> {
val key = sha1(someText)
val obs = observablesMap.getOrPut(key) {
GlobalScope.async(start = CoroutineStart.LAZY) {
// insert message to db with MessageState.SENDING
// apiClient.sendMessage(..)
// update message to db with MessageState.SENT
Unit
}
}
return obs
}
}
ursus
06/19/2019, 1:37 AMgildor
06/19/2019, 1:37 AMursus
06/19/2019, 1:38 AMgildor
06/19/2019, 1:38 AMursus
06/19/2019, 1:38 AMgildor
06/19/2019, 1:38 AMclass MessageManager {
private val observablesMap = hashMapOf<String, Deferred<Unit>>()
suspend fun postMessageObservable(someText: String) {
val key = sha1(someText)
val obs = observablesMap.getOrPut(key) {
GlobalScope.async(start = CoroutineStart.LAZY) {
// insert message to db with MessageState.SENDING
// apiClient.sendMessage(..)
// update message to db with MessageState.SENT
Unit
}
}
return obs.await()
}
}
UPD: Careful with scope, GlobalScope here only for exampleursus
06/19/2019, 1:40 AMgildor
06/19/2019, 1:40 AMursus
06/19/2019, 1:41 AMgildor
06/19/2019, 1:41 AMursus
06/19/2019, 1:41 AMgildor
06/19/2019, 1:41 AMmean if multipleplaces need to know the resultIf you cache the same result, there is no problem, Deferred caches it
ursus
06/19/2019, 1:42 AMgildor
06/19/2019, 1:43 AMursus
06/19/2019, 1:43 AMgildor
06/19/2019, 1:44 AMursus
06/19/2019, 1:44 AMgildor
06/19/2019, 1:44 AMfun forceSync() {
_state.offer(SyncStatus.SYNC)
GlobalScope.launch {
val result = if (load()) SyncStatus.IDLE else SyncStatus.FAILED
_state.offer(result)
}
}
basically thisgildor
06/19/2019, 1:46 AMursus
06/19/2019, 1:46 AMgildor
06/19/2019, 1:47 AMursus
06/19/2019, 1:48 AM