Код: Выделить всё
protocol BatteryLevelProvider {
func getBatteryLevel() -> Float
}
< /code>
Теперь мне нужно реализовать этот протокол, и в его методе мне нужно получить доступ к Mainactor, чтобы получить текущий uidevice batterylevel. < /p>
final class BaseBatteryLevelProvider: BatteryLevelProvider {
func getBatteryLevel() -> Float {
// How to access to the MainActor in sync way. One possible way that I'm thinking about is like this:
let isOnMainQueue: Bool = Thread.isMainThread
if isOnMainQueue {
return MainActor.assumeIsolated {
return UIDevice.current.batteryLevel
}
} else {
return DispatchQueue.main.sync {
MainActor.assumeIsolated {
return UIDevice.current.batteryLevel
}
}
}
}
}
Другие возможные решения. Mark Method с макросом Mainactor и используйте предварительную кость: < /p>
Код: Выделить всё
class BaseBatteryLevelProvider: @preconcurrency BatteryLevelProvider {
@MainActor
func getBatteryLevel() -> Float {
UIDevice.current.batteryLevel
}
}
< /code>
Но компилятор не предупреждает меня, когда я не в контексте матейнатора: < /p>
nonisolated func test() {
let batteryMonitor: BatteryLevelProvider = BaseBatteryLevelProvider()
let level = batteryMonitor.getBatteryLevel()
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... ted-method
Мобильная версия