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

    }

0 ответов

Другие вопросы по тегам