Firebase short Dynami c links - дождитесь завершения нескольких коротких ссылок - PullRequest
0 голосов
/ 16 июня 2020

Ищу решение для сбора всех результатов для создания динамических c коротких ссылок из вызова onSuccess.

Укороченный сценарий:

fun getShortDynamicLinkUseCase(
    onSuccessListener: (ShortDynamicLink) -> Unit
): Task<ShortDynamicLink> = Firebase.dynamicLinks.shortLinkAsync(ShortDynamicLink.Suffix.SHORT) {
        link = Uri.parse(uriString)
        domainUriPrefix = dynamicLinkHost
    }.addOnSuccessListener {
        onSuccessListener.invoke(it)
    }
}

fun getShortDynamicLink() = launch {
        try {
            getShortDynamicLinkUseCase.execute(
                 // calling onSucces for creating dynamic links -> which is async I guess ?
                 onSuccessListener = { shortLink ->
                    shortDynamicLinks.add(DynamicLinkData(appType, shortLink.shortLink))
                }
            ) 
            getShortDynamicLinkSuccess()
        } catch (throwable: Throwable) {
            getShortDynamicLinkFailed(throwable)
        }
}
val shortDynamicLinks = mutableListOf<Uri?>()

fun dummyFun() {
    getShortDynamicLink() //adding dynamic link to the list when success performed
    getShortDynamicLink() //adding dynamic link to the list when success performed

    //refering to the list of dynamic links which is empty as it is performed quicker 
    //than onSuccess is called in getShortDynamicLink() function
    someUseOf(shortDynamicLinks) 
}

1 Ответ

1 голос
/ 20 июня 2020

Я заметил, что вы уже используете Kotlin Coroutines, поэтому я бы предложил использовать библиотеку kotlinx-coroutines-play-services .

Включите ее в свой проект, добавив зависимость от вашего файла gradle:

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-play-services:$version'

И затем вы можете воспользоваться их функцией расширения await():

suspend fun getShortDynamicLinkUseCase(): ShortDynamicLink {
    return Firebase.dynamicLinks.shortLinkAsync(ShortDynamicLink.Suffix.SHORT) {
        link = Uri.parse(uriString)
        domainUriPrefix = dynamicLinkHost
    }.await()
}

suspend fun getShortDynamicLink() {
    try {
        val shortLink = getShortDynamicLinkUseCase().await()
        shortDynamicLinks.add(DynamicLinkData(appType, shortLink.shortLink))
        getShortDynamicLinkSuccess()
    } catch (throwable: Throwable) {
        getShortDynamicLinkFailed(throwable)
    }
}

fun dummyFun() = launch {
    
    getShortDynamicLink().await() //adding dynamic link to the list when success performed
    getShortDynamicLink().await() //adding dynamic link to the list when success performed

    //refering to the list of dynamic links which is empty as it is performed quicker 
    //than onSuccess is called in getShortDynamicLink() function
    someUseOf(shortDynamicLinks) 
}
...