
Artem
16.05.2018
14:51:04
platform declaration clash: the following declaration have the some jvm signature
wtf?

Костя
16.05.2018
14:52:11
А причем тут coroutines?
смотрите, я юзал BehaviorSubject для этого, сейчас я решил уйти от Rx в сторону корутин, аналог я в принципе нашел BrodcastChannel, но ради него нужно либу reactive-streams врубать, чего ради одного объекта делать не хочется совсем

Quantum Harmonizer
16.05.2018
14:52:25
wtf?
ну, столкновение сигнатур

Google

Alexander
16.05.2018
15:19:20
так а что, никто c либой Exposed не работает? Оо

Oleksandr
16.05.2018
15:46:31
Я работаю но не на топ лэвел

Alexander
16.05.2018
16:33:53
как ты ограничиваешь количество выводимых строк?
не понимаю, как добавить такие фичи как DBMS и ROWNUM
и же с ними

Roman
17.05.2018
06:32:23

Костя
17.05.2018
06:48:22

Roman
17.05.2018
06:53:47
Во втором случае тоже можно использовать async, но я предпочитаю использовать launch чтобы случайно не потерять ошибку. async ведь ее проглотит.

Алексей
17.05.2018
06:54:15

Roman
17.05.2018
06:57:45
Подробнее можно почиать в доке.
https://github.com/Kotlin/kotlinx.coroutines/blob/master/core/kotlinx-coroutines-core/README.md
Ток вот что-то она не открывается...

Алексей
17.05.2018
06:59:05
Спасибо

Roman
17.05.2018
06:59:48
Короче launch в случае ошибки покрашит программу, а async нет, вместо этого исключение бросится при вызове await.

Алексей
17.05.2018
07:01:38
А launch разве в том же потоке отрабатывает?

Google

Костя
17.05.2018
07:05:14

Roman
17.05.2018
07:05:34

Алексей
17.05.2018
07:05:59
А, понял суть
То есть launch - это как async, только всё, что есть он выбрасывает куда-то
Вместо возвращенного объекта deferred, как у async

Roman
17.05.2018
07:07:16
Ну да, что-то типа того.
Еще разница в том, что async возвращает Deferred, а launch возвращает Job.

Костя
17.05.2018
07:11:48

Алексей
17.05.2018
07:17:02
А в чем разница job и deferred?
Я бы сам глянул, но нет возможности сейчас-.-

Жабра
17.05.2018
07:19:33
А в чем разница job и deferred?
Грубо говоря, Deferred - это обёртка над результатом. К примеру
val def: Deferred<List<User>> =
async { server.loadUsers() }
val users: List<User> = def.await()

Алексей
17.05.2018
07:19:49
А job?

Anton
17.05.2018
07:21:03
deferred это фьючер

Жабра
17.05.2018
07:21:10
А job?
A Job это лишь состояние загрузки.
val job: Job = launch {
db.update(user)
}
job.join()

Алексей
17.05.2018
07:21:53
А, то есть job можно применить только чтобы спросить "эй, ты там всё?"

Жабра
17.05.2018
07:22:55

Алексей
17.05.2018
07:23:31
Ну тогда deferred это "ну чего у тебя там?"
Ясненько
Спасибо:)

Костя
17.05.2018
07:46:38

Google

Roman
17.05.2018
07:51:31
Просто убрать async тогда.

Костя
17.05.2018
07:53:17

Roman
17.05.2018
07:54:20
Ну она сразу запустится.
val task: Deferred<...> = retrofit.callSomeApi()

Костя
17.05.2018
07:54:38
серьезно ?
оО

Roman
17.05.2018
07:55:13
Ага. Не привычно после rx?)

Костя
17.05.2018
07:55:27
я думал это просто как get берешь типо, а без подписки не работает
очень пока )
но с другой стороны как Rx это если Lazy, тогда они работают как подпишешься
ну будешь ожидать ответа
а по умолчанию сразу запуск поидее

Жабра
17.05.2018
07:57:17
О, пока в тему: чё за ретрофит??

Roman
17.05.2018
07:57:24
У корутин есть тоже опция ленивого старта:
val deferred = async(start = CoroutineStart.LAZY) { ... }

Костя
17.05.2018
07:57:53
вот это схоже с Rx
а по умолчанию сразу запуск даже если никт оне ждет )

Roman
17.05.2018
07:58:56
Да. В большинестве случев этого хватает. У меня только пара мест в приложении с ленивым запуском.

Костя
17.05.2018
08:05:07
а сейчас вопрос больше по котлину, если в методе у меня есть лямбда, и внутри лямбды я присваиваю переменной значение другой переменной из метода(она определена выше), но у них совпадают имена, у переменной в лямбде и переменной методе, я могу ссылаться как-то в лямбде на переменную метода, как через this@MainActivity, но это ссылка на переменную глобальную, а мне бы на локальную как-то

whalemare
17.05.2018
08:06:53

Google

Костя
17.05.2018
08:08:14
пример:
fun method() {
val viewModel = ...
val binding = ... .apply {
viewModel = viewModel !?!?!?
}
}
вот
на глобальную можно сослаться через this@MainActivity
а в такой ситуации только давать им разные имена и всё ?
что мне не нравится (

Алексей
17.05.2018
08:10:41
Признаться, не понял
fun method() {
val viewModel = ...
val binding = let { … }.apply {
viewModel = viewModel !?!?!?
}
}

Костя
17.05.2018
08:11:40
ну вопрос в том как в apply {} засеттанть viewModel property of binding мою viewModel определенную перед binding

Алексей
17.05.2018
08:11:44
Так должно быть?

Костя
17.05.2018
08:11:45
если имена их совпадают
не
дело внутри apply
вопрос
если я пишу viewModel = viewModel он получается сеттает себе свою же переменную что была

Алексей
17.05.2018
08:12:35
Да, придется или писать this@gg.viewModel, или давать иное имя вовне

Костя
17.05.2018
08:12:38
а мне нужно ту которая выше определена засеттать туда
значит сослаться на переменную метода нельзя
но спасибо, значит или разные имена или поле уровня класса

Алексей
17.05.2018
08:18:54
можно ещё посмотреть на also

Google

Алексей
17.05.2018
08:19:38
разница с apply в том, что receiver помечается не как this, а как it (то есть нет захвата контекста)

Stas
17.05.2018
08:32:44
Народ, подскажите, пжл, что-то туплю. Как красиво переписать выражение:
value?.let {
if (it.isTarget) {
action()
}
} ?: action()

Alexey
17.05.2018
08:36:08
if (value?.isTarget() != false) {
action()
}

Костя
17.05.2018
08:37:37
Да. В большинестве случев этого хватает. У меня только пара мест в приложении с ленивым запуском.
нашел кстати нюанс в твоем решении, если запрос запущенный на первом экране отработал, и приходим на втором делаем await() то он запускается заного, я так понимаю это из-за того что результат запроса не держится нигде, и типо пока он работает, мы можем успеть await() и получим результат, а если он отрабатывает уже, await() dspsdftn только перезапуск, получается типо 2 раза запрос дергаем в некоторых ситуациях

Roman
17.05.2018
08:42:41
Нет, Deferred очень примитивный тип. Его нельзя запустить повторно и он имеет только два состояния: ожидание и результат. То есть если запрос один раз отработал, то можно сколько угодно раз вызывать await, первый раз он подождет выполнения, а все последующие будет возвращать результат сразу.

Gleb
17.05.2018
08:43:23
Deferred == Future

Костя
17.05.2018
08:47:19

Stas
17.05.2018
08:48:14

Костя
17.05.2018
08:49:34
тут вопрос держит ли ретрофит уже созданные сервисы как-то или создает каждый раз и самому надо их держать
т.к. Deffered находится в сервисе

Roman
17.05.2018
08:51:07
Не, тут надо создать именно переменную task как я показал и ее ждать. Каждый вызов ретрофит апи создает запрос.
Я для этого создаю специальные классы, которые через DI пробрасываю интересующимся.
Но глобальная переменная для теста тоже сойдет.

Костя
17.05.2018
08:53:12
понял, принял, сейчас сделаю проверю
точно, всё прошло, получается каждый вызов к сервису Retrofit == новый отдельный запрос

Artur
17.05.2018
09:04:56
Привет, есть такая штука
<T : ScreenActionEvent> registerInternal(action: String, consumer: BiConsumer<Context, T>):
пытаюсь передать в её такое:
registerInternal<MainClickActionEvent?MainClickActionEvent.ACTION, { context, event ->
и пишет что типы не может опознать(context, event)
Как решить?

Quantum Harmonizer
17.05.2018
09:06:05

Artur
17.05.2018
09:07:15
да я пытался так сделать, но мне надо положить их в мапу и тут проблема

Quantum Harmonizer
17.05.2018
09:07:30