IOS 上的 InvalidMutabilityException 使用 Kotlin Multiplatform 中的协程使用可变变量

Cor*_*lla 2 kotlin kotlin-native kotlin-multiplatform kotlin-coroutines

我简化了错误,我只有这个类:

class TestClass{
    private var string = "Hello"

    fun testError() {
        string= "It Works"
        GlobalScope.launch(Dispatchers.Default) {
            string = "Doesn't work"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我在主线程(在 IOS 上)上启动 TestClass().testError(),它会抛出一个 InvalidMutabilityException(在 line --> string = "Doesn't work")。所以我认为在创建变量的线程之外的线程上更改变量可能不是一个好主意。所以我改成这样:

class TestClass{
    private var string = "Hello"

    fun testError() {
        string= "It Works"
        GlobalScope.launch(Dispatchers.Default) {
            withContext(Dispatchers.Main) { string = "Doesn't work" }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但它仍然抛出一个错误:

kotlin.native.concurrent.InvalidMutabilityException:冻结 com.example.project.TestClass@fe10a8 的突变尝试

顺便一提。上面的两个代码都适用于 Android 端

Kev*_*gan 5

Kotlin/Native 的线程模型与 JVM 不同。TestClass在 lambda 中捕获数据时被冻结。该string分配默默地捕捉父TestClass并冻结它。

请参阅以下内容: