Доступ к контексту Mainactor в блокировании от неизолированного методаIOS

Программируем под IOS
Ответить
Anonymous
 Доступ к контексту Mainactor в блокировании от неизолированного метода

Сообщение Anonymous »

У меня такой протокол, не принадлежащий моей кодовой базе. Это пришло из библиотеки. Я извлек его в минимум, чтобы сосредоточиться на одной проблеме. < /P>

Код: Выделить всё

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
}
}
}
}
}
Итак, в основном я думаю о том, как получить доступ к домену изоляции Mainactor из неизолированного метода, но в способе блокировки/синхронизации, чтобы получить ценность BatterlyLevel и вернуть это значение по синхронизации. Если уже на Mainqueue, я не должен использовать синхронизацию, потому что это вызовет тупик. Есть ли способ, как я могу проверить условно, если код уже работает на Mainqueue? < /P>
Другие возможные решения. 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()
}
Мои основные сомнения заключаются в том, что я не уверен, что это сохранение, чтобы проверить, нахожусь ли я с помощью Thread.ismainthread>

Подробнее здесь: https://stackoverflow.com/questions/797 ... ted-method
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»