@@ -43,6 +43,17 @@ public struct RunLoopMode : RawRepresentable, Equatable, Hashable {
43
43
extension RunLoopMode {
44
44
public static let defaultRunLoopMode = RunLoopMode ( " kCFRunLoopDefaultMode " )
45
45
public static let commonModes = RunLoopMode ( " kCFRunLoopCommonModes " )
46
+
47
+ // Use this instead of .rawValue._cfObject; this will allow CFRunLoop to use pointer equality internally.
48
+ fileprivate var _cfStringUniquingKnown : CFString {
49
+ if self == . defaultRunLoopMode {
50
+ return kCFRunLoopDefaultMode
51
+ } else if self == . commonModes {
52
+ return kCFRunLoopCommonModes
53
+ } else {
54
+ return rawValue. _cfObject
55
+ }
56
+ }
46
57
}
47
58
48
59
internal func _NSRunLoopNew( _ cf: CFRunLoop ) -> Unmanaged < AnyObject > {
@@ -81,7 +92,7 @@ open class RunLoop: NSObject {
81
92
}
82
93
83
94
open func add( _ timer: Timer , forMode mode: RunLoopMode ) {
84
- CFRunLoopAddTimer ( CFRunLoopGetCurrent ( ) , timer. _cfObject, mode. rawValue . _cfObject )
95
+ CFRunLoopAddTimer ( CFRunLoopGetCurrent ( ) , timer. _cfObject, mode. _cfStringUniquingKnown )
85
96
}
86
97
87
98
open func add( _ aPort: Port , forMode mode: RunLoopMode ) {
@@ -135,7 +146,7 @@ extension RunLoop {
135
146
if _cfRunLoop !== CFRunLoopGetCurrent ( ) {
136
147
return false
137
148
}
138
- let modeArg = mode. rawValue . _cfObject
149
+ let modeArg = mode. _cfStringUniquingKnown
139
150
if _CFRunLoopFinished ( _cfRunLoop, modeArg) {
140
151
return false
141
152
}
@@ -147,7 +158,7 @@ extension RunLoop {
147
158
}
148
159
149
160
public func perform( inModes modes: [ RunLoopMode ] , block: @escaping ( ) -> Void ) {
150
- CFRunLoopPerformBlock ( getCFRunLoop ( ) , ( modes. map { $0. rawValue . _nsObject } ) . _cfObject, block)
161
+ CFRunLoopPerformBlock ( getCFRunLoop ( ) , ( modes. map { $0. _cfStringUniquingKnown } ) . _cfObject, block)
151
162
}
152
163
153
164
public func perform( _ block: @escaping ( ) -> Void ) {
0 commit comments