From 480c2672db82cc288c505f18c2497ae83ff84478 Mon Sep 17 00:00:00 2001 From: Richard Ross Date: Wed, 23 Mar 2016 14:58:28 -0700 Subject: [PATCH] Properly deliver events back to objective-c This was bugged, as HandlerConverter would be destroyed as soon as its scope was exited, causing no events to be delivered. By adding an associated object on the subscription that should be held onto by objective-c, it now only gets destroyed when the subscription does. Fixes #7. --- Sources/ParseLiveQuery/ObjCCompat.swift | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/Sources/ParseLiveQuery/ObjCCompat.swift b/Sources/ParseLiveQuery/ObjCCompat.swift index a9966bb9..4f76eb1a 100644 --- a/Sources/ParseLiveQuery/ObjCCompat.swift +++ b/Sources/ParseLiveQuery/ObjCCompat.swift @@ -254,26 +254,29 @@ extension Client { private class HandlerConverter: SubscriptionHandling { typealias PFObjectSubclass = PFObject - private let handler: ObjCCompat_SubscriptionHandling + private static var associatedObjectKey: Int = 0 + private weak var handler: ObjCCompat_SubscriptionHandling? init(handler: ObjCCompat_SubscriptionHandling) { self.handler = handler + + objc_setAssociatedObject(handler, &HandlerConverter.associatedObjectKey, self, .OBJC_ASSOCIATION_RETAIN) } private func didReceive(event: Event, forQuery query: PFQuery, inClient client: Client) { - handler.didRecieveEvent?(query, event: ObjCCompat.Event(event: event), client: client) + handler?.didRecieveEvent?(query, event: ObjCCompat.Event(event: event), client: client) } private func didEncounter(error: ErrorType, forQuery query: PFQuery, inClient client: Client) { - handler.didRecieveError?(query, error: error as NSError, client: client) + handler?.didRecieveError?(query, error: error as NSError, client: client) } private func didSubscribe(toQuery query: PFQuery, inClient client: Client) { - handler.didSubscribe?(query, client: client) + handler?.didSubscribe?(query, client: client) } private func didUnsubscribe(fromQuery query: PFQuery, inClient client: Client) { - handler.didUnsubscribe?(query, client: client) + handler?.didUnsubscribe?(query, client: client) } }