Как разобраться с ресурсом в основном актере изолированном объекте в DeinitIOS

Программируем под IOS
Ответить
Anonymous
 Как разобраться с ресурсом в основном актере изолированном объекте в Deinit

Сообщение Anonymous »

У меня есть основной актер изолированный класс, подобный этому: < /p>

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

@MainActor
open class TimerScheduler {

private enum TimerState {
case normal
case paused(remaining: TimeInterval)
}

private struct TimerInfo {
let timer: Timer
let state: TimerState
}

private var keyToTimerInfoMap = [String:TimerInfo]()
private let lifecycleChecker: () -> Bool

public init(lifecycleChecker: @escaping @MainActor () -> Bool = { true }) {

self.lifecycleChecker = lifecycleChecker

// Note: When app is in background, NSTimer will only get a few minutes of execution.
// Then the timer will be paused
// These notifications are there to ensure NSTimer is paused immediately when app goes background.
NotificationCenter.default.addObserver(self, selector: #selector(pause), name:UIApplication.willResignActiveNotification, object: nil)

NotificationCenter.default.addObserver(self, selector: #selector(resume), name:UIApplication.didBecomeActiveNotification, object: nil)
}

deinit {
NotificationCenter.default.removeObserver(self)
for (_, info) in keyToTimerInfoMap {
info.timer.invalidate()
}
}

private func unschedule(key: String) {
guard let info = keyToTimerInfoMap[key] else { return }
info.timer.invalidate()
keyToTimerInfoMap.removeValue(forKey: key)
}

// other functions

}
< /code>
У меня есть предупреждение: < /p>

Не может получить доступ к свойству 'keytotimerinfomap' с неопощими типом '[String: timerscheduler.timerinfo]' из неизолированного Deinit; Это ошибка в языковом режиме Swift 6 

Это разумно, потому что Deinit 
может произойти в любом потоке. Deinit в задаче основного актера, как это:

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

  deinit {
NotificationCenter.default.removeObserver(self)
Task { @MainActor in
for (_, info) in keyToTimerInfoMap {
info.timer.invalidate()
}
}
}
Однако, если объект deinit 'в фоновом потоке, я бы использовал объект (доступ к его полю Keytotimerinfomap ) после того, как он был сделкой, что, кажется, опасная вещь.>

Подробнее здесь: https://stackoverflow.com/questions/787 ... -in-deinit
Ответить

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

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

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

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

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