CFNotificationCenter, повторяющий заявления о событиях
Я работал над корпоративным приложением iOS/Swift (iOS 11.3, Xcode 9.3.1), в котором я хочу получать уведомления, если экран меняется (гаснет или становится активным) и записывает события в базе данных Realm. Я использую ответ от tbaranes в событиях обнаружения разблокировки экрана в IOS Swift, и он работает, но я нахожу добавленные повторы, когда экран гаснет и становится активным:
- Initial Blank: записано одно событие
Начальная повторная активация: записаны два события
Второй пробел: записаны два события
Второй Re-act: три события записаны
и этот цикл добавления дополнительного события записи каждого цикла.
Это должно быть что-то в коде (или отсутствует в коде), что вызывает аддитивный эффект, но я не могу его найти. И да, операторы печати показывают, что проблема не в базе данных Realm, а являются реальными повторяющимися утверждениями.
Мой код ниже. Любые предложения приветствуются.
CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), //center
Unmanaged.passUnretained(self).toOpaque(), // observer
displayStatusChangedCallback, // callback
"com.apple.springboard.hasBlankedScreen" as CFString, // event name
nil, // object
.deliverImmediately)
}
private let displayStatusChangedCallback: CFNotificationCallback = { _, cfObserver, cfName, _, _ in
guard let lockState = cfName?.rawValue as String? else {
return
}
let catcher = Unmanaged<AppDelegate>.fromOpaque(UnsafeRawPointer(OpaquePointer(cfObserver)!)).takeUnretainedValue()
catcher.displayStatusChanged(lockState)
print("how many times?")
}
private func displayStatusChanged(_ lockState: String) {
// the "com.apple.springboard.lockcomplete" notification will always come after the "com.apple.springboard.lockstate" notification
print("Darwin notification NAME = \(lockState)")
if lockState == "com.apple.springboard.hasBlankedScreen" {
print("A single Blank Screen")
let statusString = dbSource() // Realm database
statusString.infoString = "blanked screen"
print("statusString: \(statusString)")
statusString.save()
return
}