Fix HTTP client configuration object freezing issue on iOS (#11012)

This commit is contained in:
Tal Kirshboim 2021-12-04 05:56:40 +01:00 committed by GitHub
parent 836e40f1d2
commit 3719035787
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 18 additions and 8 deletions

View File

@ -34,15 +34,20 @@ import {{packageName}}.auth.*
KotlinxSerializer(json).ignoreOutgoingContent() KotlinxSerializer(json).ignoreOutgoingContent()
} }
private val defaultHttpClientConfig: (HttpClientConfig<*>) -> Unit by lazy { private val clientConfig: (HttpClientConfig<*>) -> Unit by lazy {
val jsonConfig: JsonFeature.Config.() -> Unit = { this.serializer = this@ApiClient.serializer } {
{ it.install(JsonFeature, jsonConfig) } // Hold a reference to the serializer to avoid freezing the entire ApiClient instance
// when the JsonFeature is configured.
val serializerReference = serializer
it.install(JsonFeature) { serializer = serializerReference }
httpClientConfig?.invoke(it)
}
} }
private val client: HttpClient by lazy { private val client: HttpClient by lazy {
val clientConfig: (HttpClientConfig<*>) -> Unit = httpClientConfig ?: defaultHttpClientConfig
httpClientEngine?.let { HttpClient(it, clientConfig) } ?: HttpClient(clientConfig) httpClientEngine?.let { HttpClient(it, clientConfig) } ?: HttpClient(clientConfig)
} }
{{#hasAuthMethods}} {{#hasAuthMethods}}
private val authentications: kotlin.collections.Map<String, Authentication> by lazy { private val authentications: kotlin.collections.Map<String, Authentication> by lazy {
mapOf({{#authMethods}}{{#isBasic}}{{#isBasicBasic}} mapOf({{#authMethods}}{{#isBasic}}{{#isBasicBasic}}

View File

@ -34,15 +34,20 @@ open class ApiClient(
KotlinxSerializer(json).ignoreOutgoingContent() KotlinxSerializer(json).ignoreOutgoingContent()
} }
private val defaultHttpClientConfig: (HttpClientConfig<*>) -> Unit by lazy { private val clientConfig: (HttpClientConfig<*>) -> Unit by lazy {
val jsonConfig: JsonFeature.Config.() -> Unit = { this.serializer = this@ApiClient.serializer } {
{ it.install(JsonFeature, jsonConfig) } // Hold a reference to the serializer to avoid freezing the entire ApiClient instance
// when the JsonFeature is configured.
val serializerReference = serializer
it.install(JsonFeature) { serializer = serializerReference }
httpClientConfig?.invoke(it)
}
} }
private val client: HttpClient by lazy { private val client: HttpClient by lazy {
val clientConfig: (HttpClientConfig<*>) -> Unit = httpClientConfig ?: defaultHttpClientConfig
httpClientEngine?.let { HttpClient(it, clientConfig) } ?: HttpClient(clientConfig) httpClientEngine?.let { HttpClient(it, clientConfig) } ?: HttpClient(clientConfig)
} }
private val authentications: kotlin.collections.Map<String, Authentication> by lazy { private val authentications: kotlin.collections.Map<String, Authentication> by lazy {
mapOf( mapOf(
"api_key" to ApiKeyAuth("header", "api_key"), "api_key" to ApiKeyAuth("header", "api_key"),