Skip to content

Commit e392a84

Browse files
committed
UserDefaultsObservation: improve locking and remove KeyboardShortcuts.Name +++ Fix swiftlint warnings
1 parent 6ac67e7 commit e392a84

File tree

2 files changed

+26
-35
lines changed

2 files changed

+26
-35
lines changed

Sources/KeyboardShortcuts/KeyboardShortcuts.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -475,9 +475,8 @@ public enum KeyboardShortcuts {
475475

476476
let observation = UserDefaultsObservation(
477477
suite: userDefaults,
478-
name: name,
479478
key: key
480-
) { name, value in
479+
) { value in
481480
if value == nil {
482481
self.unregisterShortcutIfNeeded(for: name)
483482
} else {

Sources/KeyboardShortcuts/Utilities.swift

Lines changed: 25 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -561,26 +561,21 @@ extension Character {
561561
}
562562

563563
final class UserDefaultsObservation: NSObject {
564-
typealias Callback = (_ name: KeyboardShortcuts.Name, _ newKeyValue: String?) -> Void
564+
typealias Callback = (_ newKeyValue: String?) -> Void
565565

566-
private let name: KeyboardShortcuts.Name
567566
private let key: String
568567
static var observationContext = 0
569568
private weak var suite: UserDefaults?
570569
private var isObserving = false
571570
private let callback: Callback
572571
private var lock = NSLock()
573572

574-
private var token: NSKeyValueObservation? = nil
575-
576573
init(
577574
suite: UserDefaults,
578-
name: KeyboardShortcuts.Name,
579575
key: String,
580576
_ callback: @escaping Callback
581577
) {
582578
self.suite = suite
583-
self.name = name
584579
self.key = key
585580
self.callback = callback
586581
}
@@ -590,44 +585,41 @@ final class UserDefaultsObservation: NSObject {
590585
}
591586

592587
func start() {
593-
lock.lock()
588+
lock.withLock {
589+
guard !isObserving else {
590+
return
591+
}
594592

595-
guard !isObserving else {
596-
return
593+
suite?.addObserver(
594+
self,
595+
forKeyPath: key,
596+
options: [.new],
597+
context: &Self.observationContext
598+
)
599+
isObserving = true
597600
}
598-
599-
suite?.addObserver(
600-
self,
601-
forKeyPath: key,
602-
options: [.new],
603-
context: &Self.observationContext
604-
)
605-
isObserving = true
606-
607-
lock.unlock()
608601
}
609602

610603
func invalidate() {
611-
lock.lock()
604+
lock.withLock {
605+
guard isObserving else {
606+
return
607+
}
612608

613-
guard isObserving else {
614-
return
609+
suite?.removeObserver(
610+
self,
611+
forKeyPath: key
612+
)
613+
isObserving = false
614+
suite = nil
615615
}
616-
617-
suite?.removeObserver(
618-
self,
619-
forKeyPath: key
620-
)
621-
isObserving = false
622-
suite = nil
623-
624-
lock.unlock()
625616
}
626617

618+
// swiftlint:disable:next block_based_kvo
627619
override func observeValue(
628620
forKeyPath keyPath: String?,
629621
of object: Any?,
630-
change: [NSKeyValueChangeKey: Any]?,
622+
change: [NSKeyValueChangeKey: Any]?, // swiftlint:disable:this discouraged_optional_collection
631623
context: UnsafeMutableRawPointer?
632624
) {
633625
guard
@@ -659,6 +651,6 @@ final class UserDefaultsObservation: NSObject {
659651
}
660652

661653
let encodedString = change[.newKey] as? String
662-
callback(self.name, encodedString)
654+
callback(encodedString)
663655
}
664656
}

0 commit comments

Comments
 (0)