From 2b3fa7050b71beabf471466ce4dff6e6b1666c54 Mon Sep 17 00:00:00 2001 From: zsau Date: Sat, 7 May 2016 21:12:04 -0700 Subject: [PATCH] Allow removing subscriptions by owner --- Observable-Swift/Event.swift | 4 ++++ Observable-Swift/EventReference.swift | 6 +++++- Observable-Swift/EventSubscription.swift | 5 ++++- Observable-SwiftTests/ObservableTests.swift | 14 ++++++++++++++ 4 files changed, 27 insertions(+), 2 deletions(-) diff --git a/Observable-Swift/Event.swift b/Observable-Swift/Event.swift index 36697d5..4ac016c 100644 --- a/Observable-Swift/Event.swift +++ b/Observable-Swift/Event.swift @@ -58,6 +58,10 @@ public struct Event: UnownableEvent { return add(SubscriptionType(owner: owner, handler: handler)) } + public mutating func remove(owner owner : AnyObject) { + _subscriptions = _subscriptions.filter { $0.owner !== owner } + } + public mutating func unshare() { // _subscriptions.unshare() } diff --git a/Observable-Swift/EventReference.swift b/Observable-Swift/EventReference.swift index c402a09..b1b5265 100644 --- a/Observable-Swift/EventReference.swift +++ b/Observable-Swift/EventReference.swift @@ -38,6 +38,10 @@ public class EventReference: OwnableEvent { return event.add(owner: owner, handler) } + public func remove(owner owner : AnyObject) { + return event.remove(owner: owner) + } + public convenience init() { self.init(event: Event()) } @@ -46,4 +50,4 @@ public class EventReference: OwnableEvent { self.event = event } -} \ No newline at end of file +} diff --git a/Observable-Swift/EventSubscription.swift b/Observable-Swift/EventSubscription.swift index 9dc5bb8..47f2350 100644 --- a/Observable-Swift/EventSubscription.swift +++ b/Observable-Swift/EventSubscription.swift @@ -22,6 +22,8 @@ public class EventSubscription { public typealias HandlerType = T -> () internal var _valid : () -> Bool + + internal weak var owner : AnyObject? /// Handler to be caled when value changes. internal var handler : HandlerType @@ -54,6 +56,7 @@ public class EventSubscription { } else { _valid = { [weak o] in o != nil } } + owner = o handler = h } @@ -66,4 +69,4 @@ public class EventSubscription { public func removeOwnedObject(o: AnyObject) { _owned = _owned.filter{ $0 !== o } } -} \ No newline at end of file +} diff --git a/Observable-SwiftTests/ObservableTests.swift b/Observable-SwiftTests/ObservableTests.swift index 63c3add..5c306e5 100644 --- a/Observable-SwiftTests/ObservableTests.swift +++ b/Observable-SwiftTests/ObservableTests.swift @@ -131,6 +131,20 @@ class ObservableTests: XCTestCase { XCTAssertEqual(y, 5, "Should not update after removed") } + func testRemoveByOwner() { + var x = Observable(0) + var y = 0 + + x.afterChange.add(owner:self) { _ in y += 1 } + + for i in 0..<5 { x <- i } + + x.afterChange.remove(owner:self) + + for i in 0..<5 { x <- i } + XCTAssertEqual(y, 5, "Should not update after removed") + } + func testValueAfterCopy() { let original = Observable(0) var copy = makeCopy(original)