Как запустить задачу в фоновом потоке в приложении iOS с помощью мультиплатформенной платформы Kotlin?

#ios #multithreading #grand-central-dispatch #kotlin-coroutines #kotlin-multiplatform

Вопрос:

Я пытался запускать задачи в мультиплатформенной библиотеке Kotlin в фоновом потоке проекта iOS и столкнулся с некоторыми проблемами:

Я пробовал использовать как Kotlin-сопрограммы, так и библиотеки платформы для GCD и смог запускать задачи только в главном потоке в iOS. Всякий раз, когда я пытаюсь асинхронно отправить что-либо в фоновый поток, приложение iOS вылетает со следующей ошибкой:

«котлин,родной.Неправильное исключение: незаконная попытка доступа к файлу журнала, не являющемуся общим для com.hp.jarvis.kmm.$saveLog$лямбда-0$FUNCTION_REFERENCE$9@155a948 из другого потока»

Ответ №1:

IncorrectDereferenceException по сути, это сигнал о том, что вы пытаетесь получить доступ к глобальному состоянию из фонового потока.

Ты мог бы поиграть с:

  • @ThreadLocal -> Создает копию для каждого потока определенного объекта
  • @SharedImmutable -> Заморозит ваш объект и сделает его доступным для всех потоков, обратите внимание, что если вы попытаетесь изменить значение замороженного объекта, вы получите InvalidMutabilityException

Я бы определенно прочитал этот блог, чтобы понять текущую модель памяти: https://touchlab.co/kotlin-native-concurrency/