Tenho experimentado a multiplataforma do kotlin e é brilhante, mas me deixa perplexo. O congelamento de estado entre threads faz sentido conceitualmente e funciona bem em exemplos simples onde pequenos objetos ou primitivos são passados de um lado para outro, mas em aplicativos do mundo real, não consigo contornar InvalidMutabilityException.
Pegue o seguinte snippet de código comum de um aplicativo Android
class MainViewModel(
private val objectWhichContainsNetworking: ObjectWhichContainsNetworking
)
private var coreroutineSupervisor = SupervisorJob()
private var coroutineScope: CoroutineScope = CoroutineScope(Dispatchers.Main + coreroutineSupervisor)
private fun loadResults() {
// Here: Show loading
coroutineScope.launch {
try {
val result = withContext(Dispatchers.Default) { objectWhichContainsNetworking.fetchData() }
// Here: Hide loading and show results
} catch (e: Exception) {
// Here: Hide loading and show error
}
}
}
Nada muito complexo, mas se usado em código comum e executado a partir de Kotlin / Native, coloque InvalidMutabilityException em MainViewModel.
Parece que a razão para isso é que qualquer coisa passada comContext é congelada recursivamente, portanto, porque objectWhichContainsNetworking é uma propriedade de MainViewModel e é usado em withContext, então MainViewModel é pego no congelamento.
Minha pergunta é: isso é apenas uma limitação do modelo de memória Kotlin / Native atual? Ou talvez a versão atual das corrotinas? E há alguma maneira de contornar isso?
Nota: versão das corrotinas: 1.3.9-native-mt. kotlin versão 1.4.0.
Edição 1: Parece que o código reduzido acima realmente funciona bem. Acontece que o código incriminador era uma var atualizável no modelo de exibição (usado para manter uma referência ao último estado de exibição) que fica congelado e, em seguida, lança a exceção quando tenta ser mutado. Vou tentar usar Fluxo / Canais para garantir que não haja nenhuma referência var necessária e ver se isso corrige o problema geral.
Nota: se houver uma maneira de evitar que MainViewModel seja congelado em primeiro lugar, ainda seria fantástico!
Edição 2: substituiu a var por Flow. Não consegui obter coleta de fluxo padrão no iOS até usar os ajudantes aqui:https://github.com/JetBrains/kotlinconf-app/blob/master/common/src/mobileMain/kotlin/org/jetbrains/kotlinconf/FlowUtils.kt.
MainViewModel ainda fica congelado, mas como todo o seu estado é imutável, não é mais um problema. Espero que ajude alguém!
Em seu código original, você está referenciando um campo do objeto pai, o que faz com que você capture todo o pai e o congele. Não é um problema com corrotinas. As corrotinas seguem as mesmas regras de todas as outras bibliotecas de simultaneidade no Kotlin / Native. Ele congela o lambda quando você cruza os fios.
class MainViewModel(
private val objectWhichContainsNetworking: ObjectWhichContainsNetworking
)
//yada yada
private fun loadResults() {
coroutineScope.launch {
try {
val result = withContext(Dispatchers.Default) {
//The reference to objectWhichContainsNetworking is a field ref and captures the whole view model
objectWhichContainsNetworking.fetchData()
}
} catch (e: Exception) {}
}
}
Para evitar que isso aconteça:
class MainViewModel(
private val objectWhichContainsNetworking: ObjectWhichContainsNetworking
){
init{
ensureNeverFrozen()
}
//Etc
A coisa mais complicada com o modelo de memória é isso. Se acostumando com o que está sendo capturado e evitando isso. Não é tão difícil quando você se acostuma, mas você precisa aprender o básico.
Falei longamente sobre isso:
Kotlin prático / simultaneidade nativa
Kotlin Native Concurrency Hands On
KotlinConf KN Simultaneidade
O modelo de memória está mudando, mas vai demorar um pouco antes que isso aconteça. Depois que você se acostuma com o modelo de memória, os problemas imutáveis geralmente são fáceis de diagnosticar.
Jana Duggar foi aberta sobre sua busca pelo amor. Aqui está tudo o que ela disse sobre o assunto e sua janela de cinco anos para o casamento.
O astro de 'Outlander', Sam Heughan, revelou recentemente o que vai levar do set para relembrar Jamie Fraser, o papel que o tornou uma estrela.
'She Loves You' foi escrita em uma hora, gravada em um dia, e foi a música dos Beatles com uma de suas melhores apresentações de sua carreira.
Dolly Parton e sua avó Bessie tiveram um relacionamento especial. Vovó Parton estava muito doente, mas isso não impediu Dolly de pregar uma peça nela.
Você pode achar que o carvalho ou a nogueira são madeiras resistentes, mas quando se trata da madeira mais dura do mundo, elas nem chegam perto.
O oceano é repleto de beleza, mas também esconde algumas das criaturas marinhas mais assustadoras do planeta. Muitos desses animais espreitam nas profundezas do oceano, no mundo escuro e de alta pressão do fundo do mar.
Se você está enfrentando criaturas hostis ou se preparando para cenários PvP, conhecer os melhores encantamentos de espada no Minecraft pode te dar uma grande vantagem. Encantar espadas permite causar mais dano, aumentar a quantidade de itens obtidos de criaturas e prolongar a durabilidade da sua espada.
Quando as pessoas falam sobre países socialistas, geralmente imaginam o controle total do governo e a ausência de propriedade privada. Mas, na prática, as economias socialistas variam muito.
“Children” traz uma participação especial de grande nome e algumas notícias devastadoras
Este RAV4 está em excelentes condições e está preparado para um jogo de cadeiras musicais.
Imagens de drone capturaram bombeiros parecendo lutar para apagar o incêndio.
Eyes of Wakanda está diretamente relacionado ao MCU, além de atualizações sobre X-Men '97, What If..., Demolidor e muito mais.
O anel de noivado de Kate Middleton pertenceu à Princesa Diana antes do Príncipe William pedi-la em casamento. Descubra tudo o que há para saber sobre a peça histórica aqui.
John Cleese se casou com sua esposa, Jennifer Wade, em 2012. Aqui está tudo o que você precisa saber sobre a esposa de John Cleese, Jennifer Wade.
Patton Oswalt se casou com sua esposa, a também atriz Meredith Salenger, em 2017. Aqui está tudo o que você precisa saber sobre a esposa de Patton Oswalt, Meredith Salenger.
Mena Suvari é casada com o marido Michael Hope desde 2018. Aqui está tudo o que você precisa saber sobre o marido de Mena Suvari.
Isso me atinge De repente, como tantas vezes acontece É o meio do caminho tudo de novo <Não, não aquele no Pacífico, seu marrom, aquele no carnaval> Todas as manchetes em voz alta…..
Em 2022, com o lançamento do GPT-3, a habilidade de escrita parece se tornar menos importante. Com a IA, pessoas com redação ruim também podem gerar funcionários de qualidade.
No mundo acelerado e competitivo de hoje, a carreira desempenha um papel significativo no crescimento pessoal, na estabilidade financeira e na satisfação geral com a vida. No entanto, muitos indivíduos encontram-se presos em um ciclo implacável de estagnação e insatisfação, definhando gradualmente em suas vidas profissionais.
Na semana passada, notei um comunicado de imprensa, enviado via PressGazette (um site de notícias da mídia britânica). O artigo anunciava que a Acast, a empresa de publicidade e hospedagem de podcast Scandi, lideraria um consórcio de "provavelmente os editores mais influentes" em podcasting.