@@ -20,11 +20,9 @@ public protocol ThreadEventMethodContainer {
2020 associatedtype TEventType : Eventable
2121 associatedtype TOwner : EventThread
2222
23- var wrappedValue : EventMethodTypedEventCallback < TOwner , TEventType > { get set }
23+ var wrappedValue : EventMethodTypedEventCallback < TOwner , TEventType > ? { get set }
2424
25- var owner : AnyObject ? { get set }
26-
27- mutating func unregister( )
25+ mutating func prepare( owner: AnyObject )
2826}
2927
3028/**
@@ -34,11 +32,13 @@ public protocol ThreadEventMethodContainer {
3432 - Note: Inherit from this to implement a discrete unit of code designed specifically to operate upon specific `Eventable` types containing information useful to its operation(s)
3533 */
3634open class EventThread : EventReceiver , EventThreadable {
35+ public typealias EventMethodTypedEventCallback < TOwner: EventThread , TEvent: Any > = ( _ sender: TOwner , _ event: TEvent , _ priority: EventPriority ) -> ( )
3736 /**
3837 Property Wrapper to simplify the registration of Event Callbacks in `EventThread`-inheriting types.
3938 - Author: Simon J. Stuart
4039 - Version: 4.1.0
4140 - Note: Any Event Callback implemented this way will be automatically registered for you.
41+ - Note: You cannot unregister or modify the Callback in any way. They are immutable.
4242 ````
4343 @EventMethod<MyEventThreadType, MyEventType>
4444 private var onMyEvent = {
@@ -49,47 +49,25 @@ open class EventThread: EventReceiver, EventThreadable {
4949 */
5050 @propertyWrapper
5151 public struct EventMethod < TOwner: EventThread , TEventType: Eventable > : ThreadEventMethodContainer {
52- public typealias EventMethodTypedEventCallback < TOwner: EventThread , TEvent: Any > = ( _ sender: TOwner , _ event: TEvent , _ priority: EventPriority ) -> ( )
53-
54- mutating public func unregister( ) {
55- if token == nil { return }
56- if let typedOwner = owner as? TOwner {
57- typedOwner. removeEventCallback ( token: token!)
58- }
59- }
60-
61- private var token : UUID ? = nil
62- private var lock = DispatchSemaphore ( value: 1 )
63-
64- public var wrappedValue : EventMethodTypedEventCallback < TOwner , TEventType > {
65- didSet {
66- reRegsiterListener ( )
67- }
68- }
52+ public var wrappedValue : EventMethodTypedEventCallback < TOwner , TEventType > ?
6953
70- public var owner : AnyObject ? {
71- didSet {
72- reRegsiterListener ( )
73- }
74- }
54+ private var owner : AnyObject ? = nil
7555
7656 @inline ( __always) private func callback( event: TEventType , priority: EventPriority ) {
7757 if let typedOwner = owner as? TOwner {
78- wrappedValue ( typedOwner, event, priority)
58+ wrappedValue ? ( typedOwner, event, priority)
7959 }
8060 }
61+
62+ public init ( wrappedValue: EventMethodTypedEventCallback < TOwner , TEventType > ? ) {
63+ self . wrappedValue = wrappedValue
64+ }
8165
82- mutating private func reRegsiterListener( ) {
83- lock. wait ( )
66+ mutating public func prepare( owner: AnyObject ) {
8467 if let typedOwner = owner as? TOwner {
85- unregister ( )
86- token = typedOwner. addEventCallback ( callback, forEventType: TEventType . self)
68+ self . owner = owner
69+ typedOwner. addEventCallback ( callback, forEventType: TEventType . self)
8770 }
88- lock. signal ( )
89- }
90-
91- public init ( wrappedValue: @escaping EventMethodTypedEventCallback < TOwner , TEventType > ) {
92- self . wrappedValue = wrappedValue
9371 }
9472 }
9573
@@ -113,6 +91,7 @@ open class EventThread: EventReceiver, EventThreadable {
11391 - Note: We use the Qualified Type Name as the Key because Types are not Hashable in Swift
11492 */
11593 @ThreadSafeSemaphore private var eventCallbacks = [ String: [ EventCallbackContainer] ] ( )
94+ @ThreadSafeSemaphore private var tokens = [ UUID] ( )
11695
11796 /**
11897 Invoke the appropriate Callback for the given Event
@@ -168,6 +147,9 @@ open class EventThread: EventReceiver, EventThreadable {
168147
169148 dispatcher. addReceiver ( self , forEventType: forEventType)
170149
150+ _tokens. withLock { tokens in
151+ tokens. append ( callbackContainer!. token)
152+ }
171153 return callbackContainer!. token
172154 }
173155
@@ -236,9 +218,10 @@ open class EventThread: EventReceiver, EventThreadable {
236218 */
237219 internal func registerWrappedListeners( ) {
238220 let mirror = Mirror ( reflecting: self )
221+
239222 for child in mirror. children {
240- if var child = child. value as? ( any ThreadEventMethodContainer ) {
241- child . owner = self
223+ if var typedValue = child. value as? ( any ThreadEventMethodContainer ) {
224+ typedValue . prepare ( owner: self )
242225 }
243226 }
244227 }
@@ -264,12 +247,18 @@ open class EventThread: EventReceiver, EventThreadable {
264247 - Author: Simon J. Stuart
265248 - Version: 4.1.0
266249 */
267- deinit {
268- let mirror = Mirror ( reflecting: self )
269- for child in mirror. children {
270- if var child = child. value as? ( any ThreadEventMethodContainer ) {
271- child. unregister ( )
272- }
250+ open func unregisterWrappedListeners( ) {
251+ var snapTokens = [ UUID] ( )
252+ _tokens. withLock { tokens in
253+ snapTokens = tokens
254+ tokens. removeAll ( )
255+ }
256+ for token in snapTokens {
257+ removeEventCallback ( token: token)
273258 }
274259 }
260+
261+ deinit {
262+ unregisterWrappedListeners ( )
263+ }
275264}
0 commit comments