Firebase 短动态链接 - 等待多个短链接完成

Firebase short dynamic links - wait for multiple short links completion

我正在寻找一种解决方案,用于收集通过 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) 
}

我注意到您已经在使用 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) 
}