@@ -14,13 +14,53 @@ import FoundationNetworking
1414/**
1515 A default implementation of the `QuerySubscribable` protocol using closures for callbacks.
1616 */
17- open class SubscriptionCallback < T: ParseObject > : QuerySubscribable {
17+ open class SubscriptionCallback < T: ParseObject > : QuerySubscribable , @ unchecked Sendable {
1818
1919 private let lock = NSLock ( )
20+ private let eventLock = NSLock ( )
21+ private let subscribedLock = NSLock ( )
22+ private let unsubscribedLock = NSLock ( )
2023 private var _query : Query < T >
21- fileprivate var eventHandlers = [ ( Query < T > , Event < T > ) -> Void ] ( )
22- fileprivate var subscribeHandlers = [ ( Query < T > , Bool ) -> Void ] ( )
23- fileprivate var unsubscribeHandlers = [ ( Query < T > ) -> Void ] ( )
24+ fileprivate var eventHandlers : [ ( Query < T > , Event < T > ) -> Void ] {
25+ get {
26+ eventLock. lock ( )
27+ defer { eventLock. unlock ( ) }
28+ return _eventHandlers
29+ }
30+ set {
31+ eventLock. lock ( )
32+ defer { eventLock. unlock ( ) }
33+ _eventHandlers = newValue
34+ }
35+ }
36+ fileprivate var subscribeHandlers : [ ( Query < T > , Bool ) -> Void ] {
37+ get {
38+ subscribedLock. lock ( )
39+ defer { subscribedLock. unlock ( ) }
40+ return _subscribeHandlers
41+ }
42+ set {
43+ subscribedLock. lock ( )
44+ defer { subscribedLock. unlock ( ) }
45+ _subscribeHandlers = newValue
46+ }
47+ }
48+ fileprivate var unsubscribeHandlers : [ ( Query < T > ) -> Void ] {
49+ get {
50+ unsubscribedLock. lock ( )
51+ defer { unsubscribedLock. unlock ( ) }
52+ return _unsubscribeHandlers
53+ }
54+ set {
55+ unsubscribedLock. lock ( )
56+ defer { unsubscribedLock. unlock ( ) }
57+ _unsubscribeHandlers = newValue
58+ }
59+ }
60+
61+ fileprivate var _eventHandlers = [ ( Query < T > , Event < T > ) -> Void ] ( )
62+ fileprivate var _subscribeHandlers = [ ( Query < T > , Bool ) -> Void ] ( )
63+ fileprivate var _unsubscribeHandlers = [ ( Query < T > ) -> Void ] ( )
2464
2565 public var query : Query < T > {
2666 get {
@@ -49,8 +89,9 @@ open class SubscriptionCallback<T: ParseObject>: QuerySubscribable {
4989 - parameter handler: The callback to register.
5090 - returns: The same subscription, for easy chaining.
5191 */
52- @discardableResult open func handleEvent( _ handler: @escaping ( Query < T > ,
53- Event < T > ) -> Void ) -> SubscriptionCallback {
92+ @discardableResult open func handleEvent(
93+ _ handler: @escaping @Sendable ( Query < T > , Event < T > ) -> Void
94+ ) -> SubscriptionCallback {
5495 eventHandlers. append ( handler)
5596 return self
5697 }
@@ -60,8 +101,9 @@ open class SubscriptionCallback<T: ParseObject>: QuerySubscribable {
60101 - parameter handler: The callback to register.
61102 - returns: The same subscription, for easy chaining.
62103 */
63- @discardableResult open func handleSubscribe( _ handler: @escaping ( Query < T > ,
64- Bool ) -> Void ) -> SubscriptionCallback {
104+ @discardableResult open func handleSubscribe(
105+ _ handler: @escaping @Sendable ( Query < T > , Bool ) -> Void
106+ ) -> SubscriptionCallback {
65107 subscribeHandlers. append ( handler)
66108 return self
67109 }
@@ -71,7 +113,9 @@ open class SubscriptionCallback<T: ParseObject>: QuerySubscribable {
71113 - parameter handler: The callback to register.
72114 - returns: The same subscription, for easy chaining.
73115 */
74- @discardableResult open func handleUnsubscribe( _ handler: @escaping ( Query < T > ) -> Void ) -> SubscriptionCallback {
116+ @discardableResult open func handleUnsubscribe(
117+ _ handler: @escaping @Sendable ( Query < T > ) -> Void
118+ ) -> SubscriptionCallback {
75119 unsubscribeHandlers. append ( handler)
76120 return self
77121 }
@@ -86,8 +130,10 @@ open class SubscriptionCallback<T: ParseObject>: QuerySubscribable {
86130 - parameter handler: The callback to register.
87131 - returns: The same subscription, for easy chaining.
88132 */
89- @discardableResult public func handle( _ eventType: @escaping ( T ) -> Event < T > ,
90- _ handler: @escaping ( Query < T > , T ) -> Void ) -> SubscriptionCallback {
133+ @discardableResult public func handle(
134+ _ eventType: @escaping @Sendable ( T ) -> Event < T > ,
135+ _ handler: @escaping @Sendable ( Query < T > , T ) -> Void
136+ ) -> SubscriptionCallback {
91137 return handleEvent { query, event in
92138 switch event {
93139 case . entered( let obj) where eventType ( obj) == event: handler ( query, obj)
@@ -102,7 +148,9 @@ open class SubscriptionCallback<T: ParseObject>: QuerySubscribable {
102148
103149 // MARK: QuerySubscribable
104150
105- open func didReceive( _ eventData: Data ) throws {
151+ open func didReceive(
152+ _ eventData: Data
153+ ) throws {
106154 // Need to decode the event with respect to the `ParseObject`.
107155 let eventMessage = try ParseCoding . jsonDecoder ( ) . decode ( EventResponse< T> . self , from: eventData)
108156 guard let event = Event ( event: eventMessage) else {
@@ -111,7 +159,9 @@ open class SubscriptionCallback<T: ParseObject>: QuerySubscribable {
111159 eventHandlers. forEach { $0 ( query, event) }
112160 }
113161
114- open func didSubscribe( _ new: Bool ) {
162+ open func didSubscribe(
163+ _ new: Bool
164+ ) {
115165 subscribeHandlers. forEach { $0 ( query, new) }
116166 }
117167
0 commit comments