Swift, актер: изолированное от актера свойство «сканирование» не может быть изменено из неизолированного контекста

#swift #actor #swift-concurrency

Вопрос:

У меня есть актер:

 actor StatesActor {

    var job1sActive:Bool = false
    ...

}
 

У меня есть объект, который использует этого актера:

 class MyObj {
    
    let myStates = StatesActor()
    
    func job1() async {
    
        myStates.job1IsActive = true

    }
}
 

Линия:

myStates.job1IsActive = true

ошибки с этой ошибкой:

Actor-isolated property 'job1IsActive' can not be mutated from a non-isolated context

Как я могу использовать субъекта для правильного хранения/чтения информации о состоянии, чтобы myObj мог использовать ее для чтения и установки состояния?

Комментарии:

1. Создайте функцию в своем актере, которая обновляет свойство. Затем MyObj следует вызвать эту функцию.

Ответ №1:

Как я могу использовать субъекта для правильного хранения/чтения информации о состоянии, чтобы myObj мог использовать ее для чтения и установки состояния?

Вы не можете изменять переменные экземпляра субъекта извне субъекта. В этом весь смысл актеров!

Вместо этого дайте субъекту метод, который устанавливает свою собственную переменную экземпляра. Затем вы сможете вызвать этот метод (с await ).

Комментарии:

1. туре. Мне нужно было завернуть это в метод в StatesActor…. спасибо.

2. В основном актер учит вас, как безопасно использовать многопоточность.

3. Теоретически возможны асинхронные установщики свойств. У Свифта их просто еще нет.