From 38e5a500c7f9e36fc4cf84d9e0c60e783682a6ca Mon Sep 17 00:00:00 2001 From: Mo Ramezanpoor Date: Fri, 29 Jul 2016 14:06:13 +0100 Subject: [PATCH 01/18] Makes some disposable classes marked as final. --- RxSwift/Disposables/BooleanDisposable.swift | 2 +- RxSwift/Disposables/CompositeDisposable.swift | 2 +- RxSwift/Disposables/DisposeBag.swift | 2 +- RxSwift/Disposables/RefCountDisposable.swift | 2 +- RxSwift/Disposables/ScheduledDisposable.swift | 2 +- RxSwift/Disposables/SerialDisposable.swift | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/RxSwift/Disposables/BooleanDisposable.swift b/RxSwift/Disposables/BooleanDisposable.swift index 05b8a43d..524faf26 100644 --- a/RxSwift/Disposables/BooleanDisposable.swift +++ b/RxSwift/Disposables/BooleanDisposable.swift @@ -11,7 +11,7 @@ import Foundation /** Represents a disposable resource that can be checked for disposal status. */ -public class BooleanDisposable : Disposable, Cancelable { +public final class BooleanDisposable : Disposable, Cancelable { internal static let BooleanDisposableTrue = BooleanDisposable(disposed: true) private var _disposed = false diff --git a/RxSwift/Disposables/CompositeDisposable.swift b/RxSwift/Disposables/CompositeDisposable.swift index a60c2730..25989ccd 100644 --- a/RxSwift/Disposables/CompositeDisposable.swift +++ b/RxSwift/Disposables/CompositeDisposable.swift @@ -11,7 +11,7 @@ import Foundation /** Represents a group of disposable resources that are disposed together. */ -public class CompositeDisposable : DisposeBase, Disposable, Cancelable { +public final class CompositeDisposable : DisposeBase, Disposable, Cancelable { public typealias DisposeKey = Bag.KeyType private var _lock = SpinLock() diff --git a/RxSwift/Disposables/DisposeBag.swift b/RxSwift/Disposables/DisposeBag.swift index c466515d..c72dcaee 100644 --- a/RxSwift/Disposables/DisposeBag.swift +++ b/RxSwift/Disposables/DisposeBag.swift @@ -31,7 +31,7 @@ or create a new one in its place. In case explicit disposal is necessary, there is also `CompositeDisposable`. */ -public class DisposeBag: DisposeBase { +public final class DisposeBag: DisposeBase { private var _lock = SpinLock() diff --git a/RxSwift/Disposables/RefCountDisposable.swift b/RxSwift/Disposables/RefCountDisposable.swift index b7e46f7d..25769f1d 100644 --- a/RxSwift/Disposables/RefCountDisposable.swift +++ b/RxSwift/Disposables/RefCountDisposable.swift @@ -11,7 +11,7 @@ import Foundation /** Represents a disposable resource that only disposes its underlying disposable resource when all dependent disposable objects have been disposed. */ -public class RefCountDisposable : DisposeBase, Cancelable { +public final class RefCountDisposable : DisposeBase, Cancelable { private var _lock = SpinLock() private var _disposable = nil as Disposable? private var _primaryDisposed = false diff --git a/RxSwift/Disposables/ScheduledDisposable.swift b/RxSwift/Disposables/ScheduledDisposable.swift index 7e13f18f..03b5d818 100644 --- a/RxSwift/Disposables/ScheduledDisposable.swift +++ b/RxSwift/Disposables/ScheduledDisposable.swift @@ -16,7 +16,7 @@ private let disposeScheduledDisposable: (ScheduledDisposable) -> Disposable = { /** Represents a disposable resource whose disposal invocation will be scheduled on the specified scheduler. */ -public class ScheduledDisposable : Cancelable { +public final class ScheduledDisposable : Cancelable { public let scheduler: ImmediateSchedulerType private var _disposed: AtomicInt = 0 diff --git a/RxSwift/Disposables/SerialDisposable.swift b/RxSwift/Disposables/SerialDisposable.swift index cb5c4e31..cbc42c27 100644 --- a/RxSwift/Disposables/SerialDisposable.swift +++ b/RxSwift/Disposables/SerialDisposable.swift @@ -11,7 +11,7 @@ import Foundation /** Represents a disposable resource whose underlying disposable resource can be replaced by another disposable resource, causing automatic disposal of the previous underlying disposable resource. */ -public class SerialDisposable : DisposeBase, Cancelable { +public final class SerialDisposable : DisposeBase, Cancelable { private var _lock = SpinLock() // state From cb5d23c7579a7a9616fd27d5543e829c3eb5d71f Mon Sep 17 00:00:00 2001 From: Mo Ramezanpoor Date: Fri, 29 Jul 2016 14:23:16 +0100 Subject: [PATCH 02/18] Removes defunct NAryDisposable.(swift|tt) files. --- Rx.xcodeproj/project.pbxproj | 12 ------------ RxSwift/Disposables/NAryDisposable.swift | 10 ---------- RxSwift/Disposables/NAryDisposable.tt | 9 --------- 3 files changed, 31 deletions(-) delete mode 100644 RxSwift/Disposables/NAryDisposable.swift delete mode 100644 RxSwift/Disposables/NAryDisposable.tt diff --git a/Rx.xcodeproj/project.pbxproj b/Rx.xcodeproj/project.pbxproj index 1aa1b67a..9c754814 100644 --- a/Rx.xcodeproj/project.pbxproj +++ b/Rx.xcodeproj/project.pbxproj @@ -121,8 +121,6 @@ C8093CDE1B8A72BE0088E94D /* DisposeBag.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C581B8A72BE0088E94D /* DisposeBag.swift */; }; C8093CDF1B8A72BE0088E94D /* DisposeBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C591B8A72BE0088E94D /* DisposeBase.swift */; }; C8093CE01B8A72BE0088E94D /* DisposeBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C591B8A72BE0088E94D /* DisposeBase.swift */; }; - C8093CE11B8A72BE0088E94D /* NAryDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C5A1B8A72BE0088E94D /* NAryDisposable.swift */; }; - C8093CE21B8A72BE0088E94D /* NAryDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C5A1B8A72BE0088E94D /* NAryDisposable.swift */; }; C8093CE51B8A72BE0088E94D /* NopDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C5C1B8A72BE0088E94D /* NopDisposable.swift */; }; C8093CE61B8A72BE0088E94D /* NopDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C5C1B8A72BE0088E94D /* NopDisposable.swift */; }; C8093CE71B8A72BE0088E94D /* ScheduledDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C5D1B8A72BE0088E94D /* ScheduledDisposable.swift */; }; @@ -907,7 +905,6 @@ C8F0BFF21BBBFB8B001B112F /* ObserverType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093CAB1B8A72BE0088E94D /* ObserverType.swift */; }; C8F0BFF31BBBFB8B001B112F /* SubscribeOn.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C8B1B8A72BE0088E94D /* SubscribeOn.swift */; }; C8F0BFF41BBBFB8B001B112F /* Observable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C681B8A72BE0088E94D /* Observable.swift */; }; - C8F0BFF51BBBFB8B001B112F /* NAryDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C5A1B8A72BE0088E94D /* NAryDisposable.swift */; }; C8F0BFF61BBBFB8B001B112F /* SerialDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C5F1B8A72BE0088E94D /* SerialDisposable.swift */; }; C8F0BFF71BBBFB8B001B112F /* Never.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8C3DA0B1B93959F004D233E /* Never.swift */; }; C8F0BFF91BBBFB8B001B112F /* Event.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C641B8A72BE0088E94D /* Event.swift */; }; @@ -1106,7 +1103,6 @@ D2EBEAF21BB9B6AE003A27DC /* CompositeDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C571B8A72BE0088E94D /* CompositeDisposable.swift */; }; D2EBEAF31BB9B6AE003A27DC /* DisposeBag.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C581B8A72BE0088E94D /* DisposeBag.swift */; }; D2EBEAF41BB9B6AE003A27DC /* DisposeBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C591B8A72BE0088E94D /* DisposeBase.swift */; }; - D2EBEAF51BB9B6AE003A27DC /* NAryDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C5A1B8A72BE0088E94D /* NAryDisposable.swift */; }; D2EBEAF61BB9B6B2003A27DC /* NopDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C5C1B8A72BE0088E94D /* NopDisposable.swift */; }; D2EBEAF71BB9B6B2003A27DC /* ScheduledDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C5D1B8A72BE0088E94D /* ScheduledDisposable.swift */; }; D2EBEAF91BB9B6B2003A27DC /* SerialDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C5F1B8A72BE0088E94D /* SerialDisposable.swift */; }; @@ -1443,8 +1439,6 @@ C8093C571B8A72BE0088E94D /* CompositeDisposable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CompositeDisposable.swift; sourceTree = ""; }; C8093C581B8A72BE0088E94D /* DisposeBag.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DisposeBag.swift; sourceTree = ""; }; C8093C591B8A72BE0088E94D /* DisposeBase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DisposeBase.swift; sourceTree = ""; }; - C8093C5A1B8A72BE0088E94D /* NAryDisposable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NAryDisposable.swift; sourceTree = ""; }; - C8093C5B1B8A72BE0088E94D /* NAryDisposable.tt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = NAryDisposable.tt; sourceTree = ""; }; C8093C5C1B8A72BE0088E94D /* NopDisposable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NopDisposable.swift; sourceTree = ""; }; C8093C5D1B8A72BE0088E94D /* ScheduledDisposable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScheduledDisposable.swift; sourceTree = ""; }; C8093C5F1B8A72BE0088E94D /* SerialDisposable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SerialDisposable.swift; sourceTree = ""; }; @@ -1988,8 +1982,6 @@ C8093C581B8A72BE0088E94D /* DisposeBag.swift */, C8093C591B8A72BE0088E94D /* DisposeBase.swift */, C84CC5661BDD08A500E06A64 /* SubscriptionDisposable.swift */, - C8093C5A1B8A72BE0088E94D /* NAryDisposable.swift */, - C8093C5B1B8A72BE0088E94D /* NAryDisposable.tt */, C8093C5C1B8A72BE0088E94D /* NopDisposable.swift */, CB883B3F1BE24C15000AC2EE /* RefCountDisposable.swift */, C8093C5D1B8A72BE0088E94D /* ScheduledDisposable.swift */, @@ -3943,7 +3935,6 @@ CBEE77201BD649A000AD584C /* ToArray.swift in Sources */, C8093CFE1B8A72BE0088E94D /* Observable.swift in Sources */, C84CC55E1BDD010800E06A64 /* SynchronizedUnsubscribeType.swift in Sources */, - C8093CE21B8A72BE0088E94D /* NAryDisposable.swift in Sources */, C8093CEC1B8A72BE0088E94D /* SerialDisposable.swift in Sources */, C8C3DA0D1B93959F004D233E /* Never.swift in Sources */, C84CC5681BDD08A500E06A64 /* SubscriptionDisposable.swift in Sources */, @@ -4166,7 +4157,6 @@ CBEE771F1BD649A000AD584C /* ToArray.swift in Sources */, C8093CFD1B8A72BE0088E94D /* Observable.swift in Sources */, C84CC55D1BDD010800E06A64 /* SynchronizedUnsubscribeType.swift in Sources */, - C8093CE11B8A72BE0088E94D /* NAryDisposable.swift in Sources */, C8093CEB1B8A72BE0088E94D /* SerialDisposable.swift in Sources */, C8C3DA0C1B93959F004D233E /* Never.swift in Sources */, C84CC5671BDD08A500E06A64 /* SubscriptionDisposable.swift in Sources */, @@ -4313,7 +4303,6 @@ CBEE77221BD649A000AD584C /* ToArray.swift in Sources */, C8F0BFF41BBBFB8B001B112F /* Observable.swift in Sources */, C84CC5601BDD010800E06A64 /* SynchronizedUnsubscribeType.swift in Sources */, - C8F0BFF51BBBFB8B001B112F /* NAryDisposable.swift in Sources */, C8F0BFF61BBBFB8B001B112F /* SerialDisposable.swift in Sources */, C8F0BFF71BBBFB8B001B112F /* Never.swift in Sources */, C84CC56A1BDD08A500E06A64 /* SubscriptionDisposable.swift in Sources */, @@ -4607,7 +4596,6 @@ D2EBEAF61BB9B6B2003A27DC /* NopDisposable.swift in Sources */, CB30D9EB1BF0E3500084C1C0 /* SingleAsync.swift in Sources */, D2EBEAFF1BB9B6BA003A27DC /* Buffer.swift in Sources */, - D2EBEAF51BB9B6AE003A27DC /* NAryDisposable.swift in Sources */, D2EBEB1D1BB9B6C1003A27DC /* Scan.swift in Sources */, D2EBEB261BB9B6C1003A27DC /* Throttle.swift in Sources */, D2EBEAE81BB9B697003A27DC /* Rx.swift in Sources */, diff --git a/RxSwift/Disposables/NAryDisposable.swift b/RxSwift/Disposables/NAryDisposable.swift deleted file mode 100644 index b39cd98b..00000000 --- a/RxSwift/Disposables/NAryDisposable.swift +++ /dev/null @@ -1,10 +0,0 @@ -// This file is autogenerated. Take a look at `Preprocessor` target in RxSwift project -// -// NAryDisposable.swift -// RxSwift -// -// Created by Krunoslav Zaher on 8/20/15. -// Copyright © 2015 Krunoslav Zaher. All rights reserved. -// - -import Foundation diff --git a/RxSwift/Disposables/NAryDisposable.tt b/RxSwift/Disposables/NAryDisposable.tt deleted file mode 100644 index 7128cddb..00000000 --- a/RxSwift/Disposables/NAryDisposable.tt +++ /dev/null @@ -1,9 +0,0 @@ -// -// NAryDisposable.swift -// RxSwift -// -// Created by Krunoslav Zaher on 8/20/15. -// Copyright © 2015 Krunoslav Zaher. All rights reserved. -// - -import Foundation From dbc635d6e7a873720b275d85a962bbf2516023ae Mon Sep 17 00:00:00 2001 From: Mo Ramezanpoor Date: Tue, 2 Aug 2016 14:01:12 +0100 Subject: [PATCH 03/18] Create Disposables type. --- Rx.xcodeproj/project.pbxproj | 10 ++++++ RxSwift/Disposables/Disposables.swift | 48 +++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 RxSwift/Disposables/Disposables.swift diff --git a/Rx.xcodeproj/project.pbxproj b/Rx.xcodeproj/project.pbxproj index 9c754814..5f51d1d3 100644 --- a/Rx.xcodeproj/project.pbxproj +++ b/Rx.xcodeproj/project.pbxproj @@ -1015,6 +1015,10 @@ CBEE77201BD649A000AD584C /* ToArray.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBEE771E1BD649A000AD584C /* ToArray.swift */; }; CBEE77211BD649A000AD584C /* ToArray.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBEE771E1BD649A000AD584C /* ToArray.swift */; }; CBEE77221BD649A000AD584C /* ToArray.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBEE771E1BD649A000AD584C /* ToArray.swift */; }; + CDDEF16A1D4FB40000CA8546 /* Disposables.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDDEF1691D4FB40000CA8546 /* Disposables.swift */; }; + CDDEF16B1D4FB40000CA8546 /* Disposables.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDDEF1691D4FB40000CA8546 /* Disposables.swift */; }; + CDDEF16C1D4FB40000CA8546 /* Disposables.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDDEF1691D4FB40000CA8546 /* Disposables.swift */; }; + CDDEF16D1D4FB40000CA8546 /* Disposables.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDDEF1691D4FB40000CA8546 /* Disposables.swift */; }; D203C4F31BB9C4CA00D02D00 /* RxCollectionViewReactiveArrayDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = C88253F11B8A752B00B02D69 /* RxCollectionViewReactiveArrayDataSource.swift */; }; D203C4F41BB9C52400D02D00 /* RxTableViewReactiveArrayDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = C88253F21B8A752B00B02D69 /* RxTableViewReactiveArrayDataSource.swift */; }; D203C4F51BB9C52900D02D00 /* ItemEvents.swift in Sources */ = {isa = PBXBuildFile; fileRef = C88253F41B8A752B00B02D69 /* ItemEvents.swift */; }; @@ -1757,6 +1761,7 @@ CB883B441BE256D4000AC2EE /* BooleanDisposable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BooleanDisposable.swift; sourceTree = ""; }; CB883B491BE369AA000AC2EE /* AddRef.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddRef.swift; sourceTree = ""; }; CBEE771E1BD649A000AD584C /* ToArray.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ToArray.swift; sourceTree = ""; }; + CDDEF1691D4FB40000CA8546 /* Disposables.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Disposables.swift; sourceTree = ""; }; D2138C751BB9BE9800339B5C /* RxCocoa.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxCocoa.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D2245A1A1BD5657300E7146F /* WithLatestFrom.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WithLatestFrom.swift; sourceTree = ""; }; D22B6D251BC8504A00BCE0AB /* SkipWhile.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SkipWhile.swift; sourceTree = ""; }; @@ -1988,6 +1993,7 @@ C8093C5F1B8A72BE0088E94D /* SerialDisposable.swift */, C8093C601B8A72BE0088E94D /* SingleAssignmentDisposable.swift */, C8093C611B8A72BE0088E94D /* StableCompositeDisposable.swift */, + CDDEF1691D4FB40000CA8546 /* Disposables.swift */, ); path = Disposables; sourceTree = ""; @@ -3911,6 +3917,7 @@ C8093D9E1B8A72BE0088E94D /* SerialDispatchQueueScheduler.swift in Sources */, C8093D341B8A72BE0088E94D /* RefCount.swift in Sources */, C8093D0E1B8A72BE0088E94D /* Concat.swift in Sources */, + CDDEF16B1D4FB40000CA8546 /* Disposables.swift in Sources */, C8093CCA1B8A72BE0088E94D /* Lock.swift in Sources */, C8093D441B8A72BE0088E94D /* Take.swift in Sources */, C84CC5591BDCF51200E06A64 /* SynchronizedSubscribeType.swift in Sources */, @@ -4133,6 +4140,7 @@ C8093D9D1B8A72BE0088E94D /* SerialDispatchQueueScheduler.swift in Sources */, C8093D331B8A72BE0088E94D /* RefCount.swift in Sources */, C8093D0D1B8A72BE0088E94D /* Concat.swift in Sources */, + CDDEF16A1D4FB40000CA8546 /* Disposables.swift in Sources */, C8093CC91B8A72BE0088E94D /* Lock.swift in Sources */, C8093D431B8A72BE0088E94D /* Take.swift in Sources */, C84CC5581BDCF51200E06A64 /* SynchronizedSubscribeType.swift in Sources */, @@ -4279,6 +4287,7 @@ C8F0BFE01BBBFB8B001B112F /* SerialDispatchQueueScheduler.swift in Sources */, C8F0BFE11BBBFB8B001B112F /* RefCount.swift in Sources */, C8F0BFE21BBBFB8B001B112F /* Concat.swift in Sources */, + CDDEF16D1D4FB40000CA8546 /* Disposables.swift in Sources */, C8F0BFE31BBBFB8B001B112F /* Lock.swift in Sources */, C8F0BFE41BBBFB8B001B112F /* Take.swift in Sources */, C84CC55B1BDCF51200E06A64 /* SynchronizedSubscribeType.swift in Sources */, @@ -4619,6 +4628,7 @@ D2EBEB2B1BB9B6CA003A27DC /* Observable+Aggregate.swift in Sources */, D2EBEB291BB9B6C1003A27DC /* Zip+arity.swift in Sources */, D2EBEB241BB9B6C1003A27DC /* TakeUntil.swift in Sources */, + CDDEF16C1D4FB40000CA8546 /* Disposables.swift in Sources */, C84CC55A1BDCF51200E06A64 /* SynchronizedSubscribeType.swift in Sources */, D2EBEB3B1BB9B6D8003A27DC /* OperationQueueScheduler.swift in Sources */, D2EBEAE51BB9B697003A27DC /* AnyObserver.swift in Sources */, diff --git a/RxSwift/Disposables/Disposables.swift b/RxSwift/Disposables/Disposables.swift new file mode 100644 index 00000000..ff4bd1ac --- /dev/null +++ b/RxSwift/Disposables/Disposables.swift @@ -0,0 +1,48 @@ +// +// Disposables.swift +// Rx +// +// Created by Mohsen Ramezanpoor on 01/08/2016. +// Copyright © 2016 Mohsen Ramezanpoor. All rights reserved. +// + +import Foundation + +public struct Disposables { + +} + +public extension Disposables { + + static let empty: Disposable = NopDisposable.instance + + static func create(with action: () -> ()) -> Disposable { + return AnonymousDisposable(action) + } + + static func create(_ disposable1: Disposable, _ disposable2: Disposable) -> Disposable { + return BinaryDisposable(disposable1, disposable2) + } + + static func create(_ disposable1: Disposable, _ disposable2: Disposable, _ disposable3: Disposable) -> Disposable { + return CompositeDisposable(disposable1, disposable2, disposable3) + } + + static func create(_ disposable1: Disposable, _ disposable2: Disposable, _ disposable3: Disposable, _ disposable4: Disposable) -> Disposable { + return CompositeDisposable(disposable1, disposable2, disposable3, disposable4) + } + + static func create(_ disposables: [Disposable]) -> Disposable { + switch disposables.count { + case 0: + return Disposables.empty + case 1: + return disposables[0] + case 2: + return BinaryDisposable(disposables[0], disposables[1]) + default: + return CompositeDisposable(disposables: disposables) + } + } + +} From eb646a97a6349c262207de23af9b91543f58d3aa Mon Sep 17 00:00:00 2001 From: Mo Ramezanpoor Date: Tue, 9 Aug 2016 10:20:55 +0100 Subject: [PATCH 04/18] Makes `BinaryDisposable` private. Uses `Disposables.create()` instead. --- RxSwift/Disposables/BinaryDisposable.swift | 14 +++++++++++--- RxSwift/Disposables/Disposables.swift | 8 ++------ .../Disposables/StableCompositeDisposable.swift | 4 ++-- RxSwift/ObservableType+Extensions.swift | 4 ++-- .../Observables/Implementations/Multicast.swift | 2 +- RxSwift/Observables/Implementations/Skip.swift | 2 +- RxSwift/Observables/Implementations/Take.swift | 2 +- 7 files changed, 20 insertions(+), 16 deletions(-) diff --git a/RxSwift/Disposables/BinaryDisposable.swift b/RxSwift/Disposables/BinaryDisposable.swift index b6176592..aa1f811b 100644 --- a/RxSwift/Disposables/BinaryDisposable.swift +++ b/RxSwift/Disposables/BinaryDisposable.swift @@ -11,7 +11,7 @@ import Foundation /** Represents two disposable resources that are disposed together. */ -public final class BinaryDisposable : DisposeBase, Cancelable { +private final class BinaryDisposable : DisposeBase, Cancelable { private var _disposed: AtomicInt = 0 @@ -22,7 +22,7 @@ public final class BinaryDisposable : DisposeBase, Cancelable { /** - returns: Was resource disposed. */ - public var disposed: Bool { + var disposed: Bool { return _disposed > 0 } @@ -43,7 +43,7 @@ public final class BinaryDisposable : DisposeBase, Cancelable { After invoking disposal action, disposal action will be dereferenced. */ - public func dispose() { + func dispose() { if AtomicCompareAndSwap(0, 1, &_disposed) { _disposable1?.dispose() _disposable2?.dispose() @@ -52,3 +52,11 @@ public final class BinaryDisposable : DisposeBase, Cancelable { } } } + +public extension Disposables { + + static func create(_ disposable1: Disposable, _ disposable2: Disposable) -> Disposable { + return BinaryDisposable(disposable1, disposable2) + } + +} diff --git a/RxSwift/Disposables/Disposables.swift b/RxSwift/Disposables/Disposables.swift index ff4bd1ac..388172c6 100644 --- a/RxSwift/Disposables/Disposables.swift +++ b/RxSwift/Disposables/Disposables.swift @@ -19,11 +19,7 @@ public extension Disposables { static func create(with action: () -> ()) -> Disposable { return AnonymousDisposable(action) } - - static func create(_ disposable1: Disposable, _ disposable2: Disposable) -> Disposable { - return BinaryDisposable(disposable1, disposable2) - } - + static func create(_ disposable1: Disposable, _ disposable2: Disposable, _ disposable3: Disposable) -> Disposable { return CompositeDisposable(disposable1, disposable2, disposable3) } @@ -39,7 +35,7 @@ public extension Disposables { case 1: return disposables[0] case 2: - return BinaryDisposable(disposables[0], disposables[1]) + return Disposables.create(disposables[0], disposables[1]) default: return CompositeDisposable(disposables: disposables) } diff --git a/RxSwift/Disposables/StableCompositeDisposable.swift b/RxSwift/Disposables/StableCompositeDisposable.swift index 7098867c..d51ddada 100644 --- a/RxSwift/Disposables/StableCompositeDisposable.swift +++ b/RxSwift/Disposables/StableCompositeDisposable.swift @@ -10,6 +10,6 @@ import Foundation public final class StableCompositeDisposable { public static func create(_ disposable1: Disposable, _ disposable2: Disposable) -> Disposable { - return BinaryDisposable(disposable1, disposable2) + return Disposables.create(disposable1, disposable2) } -} \ No newline at end of file +} diff --git a/RxSwift/ObservableType+Extensions.swift b/RxSwift/ObservableType+Extensions.swift index ead7ba0d..bfed0064 100644 --- a/RxSwift/ObservableType+Extensions.swift +++ b/RxSwift/ObservableType+Extensions.swift @@ -65,7 +65,7 @@ extension ObservableType { disposable.dispose() } } - return BinaryDisposable( + return Disposables.create( self.subscribeSafe(observer), disposable ) @@ -106,7 +106,7 @@ extension ObservableType { disposable.dispose() } } - return BinaryDisposable( + return Disposables.create( self.subscribeSafe(observer), disposable ) diff --git a/RxSwift/Observables/Implementations/Multicast.swift b/RxSwift/Observables/Implementations/Multicast.swift index 2ce88e09..6bf7a116 100644 --- a/RxSwift/Observables/Implementations/Multicast.swift +++ b/RxSwift/Observables/Implementations/Multicast.swift @@ -30,7 +30,7 @@ class MulticastSink: Sink, ObserverType { let subscription = observable.subscribe(self) let connection = connectable.connect() - return BinaryDisposable(subscription, connection) + return Disposables.create(subscription, connection) } catch let e { forwardOn(.error(e)) diff --git a/RxSwift/Observables/Implementations/Skip.swift b/RxSwift/Observables/Implementations/Skip.swift index 232d045a..4e2a2034 100644 --- a/RxSwift/Observables/Implementations/Skip.swift +++ b/RxSwift/Observables/Implementations/Skip.swift @@ -105,7 +105,7 @@ class SkipTimeSink : Sink let disposeSubscription = parent.source.subscribe(self) - return BinaryDisposable(disposeTimer, disposeSubscription) + return Disposables.create(disposeTimer, disposeSubscription) } } diff --git a/RxSwift/Observables/Implementations/Take.swift b/RxSwift/Observables/Implementations/Take.swift index 4bd6908a..855d77ec 100644 --- a/RxSwift/Observables/Implementations/Take.swift +++ b/RxSwift/Observables/Implementations/Take.swift @@ -119,7 +119,7 @@ class TakeTimeSink let disposeSubscription = _parent._source.subscribe(self) - return BinaryDisposable(disposeTimer, disposeSubscription) + return Disposables.create(disposeTimer, disposeSubscription) } } From 23ae9692e7a25a49ce9a7c99fd52428b14e7d786 Mon Sep 17 00:00:00 2001 From: Mo Ramezanpoor Date: Tue, 9 Aug 2016 10:30:18 +0100 Subject: [PATCH 05/18] Change Disposables.empty from a property to a method to mirror `Observable.empty()`. --- RxSwift/Disposables/Disposables.swift | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/RxSwift/Disposables/Disposables.swift b/RxSwift/Disposables/Disposables.swift index 388172c6..a347929d 100644 --- a/RxSwift/Disposables/Disposables.swift +++ b/RxSwift/Disposables/Disposables.swift @@ -14,12 +14,14 @@ public struct Disposables { public extension Disposables { - static let empty: Disposable = NopDisposable.instance + static func empty() -> Disposable { + return NopDisposable.instance + } static func create(with action: () -> ()) -> Disposable { return AnonymousDisposable(action) } - + static func create(_ disposable1: Disposable, _ disposable2: Disposable, _ disposable3: Disposable) -> Disposable { return CompositeDisposable(disposable1, disposable2, disposable3) } @@ -31,7 +33,7 @@ public extension Disposables { static func create(_ disposables: [Disposable]) -> Disposable { switch disposables.count { case 0: - return Disposables.empty + return Disposables.empty() case 1: return disposables[0] case 2: From 0058d2ff67850cd7be5efbbed3f3f66974cee101 Mon Sep 17 00:00:00 2001 From: Mo Ramezanpoor Date: Tue, 9 Aug 2016 10:32:35 +0100 Subject: [PATCH 06/18] Deprecates `NopDisposable.instance` in favour of `Disposables.empty()`. --- RxSwift/Disposables/NopDisposable.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/RxSwift/Disposables/NopDisposable.swift b/RxSwift/Disposables/NopDisposable.swift index fe8a0c73..5004311d 100644 --- a/RxSwift/Disposables/NopDisposable.swift +++ b/RxSwift/Disposables/NopDisposable.swift @@ -18,6 +18,7 @@ public struct NopDisposable : Disposable { /** Singleton instance of `NopDisposable`. */ + @available(*, deprecated, renamed: "Disposables.empty()") public static let instance: Disposable = NopDisposable() init() { @@ -29,4 +30,4 @@ public struct NopDisposable : Disposable { */ public func dispose() { } -} \ No newline at end of file +} From ac876f35dbe67b23c183b3a674b003f5c45c6dc7 Mon Sep 17 00:00:00 2001 From: Mo Ramezanpoor Date: Tue, 9 Aug 2016 10:34:43 +0100 Subject: [PATCH 07/18] Deprecates `AnonymousDisposable.init` in favour of `Disposables.create()`. --- RxSwift/Disposables/AnonymousDisposable.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/RxSwift/Disposables/AnonymousDisposable.swift b/RxSwift/Disposables/AnonymousDisposable.swift index 17a40910..d6fbf601 100644 --- a/RxSwift/Disposables/AnonymousDisposable.swift +++ b/RxSwift/Disposables/AnonymousDisposable.swift @@ -31,6 +31,7 @@ public final class AnonymousDisposable : DisposeBase, Cancelable { - parameter disposeAction: Disposal action which will be run upon calling `dispose`. */ + @available(*, deprecated, renamed: "Disposables.create") public init(_ disposeAction: DisposeAction) { _disposeAction = disposeAction super.init() From 2df8c4307790226bc4aa646f6e7e98181d55c063 Mon Sep 17 00:00:00 2001 From: Mo Ramezanpoor Date: Tue, 9 Aug 2016 10:45:29 +0100 Subject: [PATCH 08/18] Deprecates `StableCompositeDisposable.create()` in favour of `Disposables.create()`. --- RxSwift/Disposables/StableCompositeDisposable.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/RxSwift/Disposables/StableCompositeDisposable.swift b/RxSwift/Disposables/StableCompositeDisposable.swift index d51ddada..ad10eacc 100644 --- a/RxSwift/Disposables/StableCompositeDisposable.swift +++ b/RxSwift/Disposables/StableCompositeDisposable.swift @@ -9,6 +9,7 @@ import Foundation public final class StableCompositeDisposable { + @available(*, deprecated, renamed: "Disposables.create") public static func create(_ disposable1: Disposable, _ disposable2: Disposable) -> Disposable { return Disposables.create(disposable1, disposable2) } From 2812da1f5e9b3491a8d6b6699ee2efd73185e3c6 Mon Sep 17 00:00:00 2001 From: Mo Ramezanpoor Date: Wed, 10 Aug 2016 14:25:19 +0100 Subject: [PATCH 09/18] Replace immutable initialisations of `CompositeDisposable` with `Disposables.create()`. The factory methods will select specialised implementations based on the case. --- RxCocoa/Common/DelegateProxyType.swift | 2 +- .../TestScheduler+MarbleTests.swift | 2 +- .../UIImagePickerController+RxCreate.swift | 2 +- .../CombineLatest+CollectionType.swift | 2 +- .../Implementations/CombineLatest+arity.swift | 14 +++++++------- .../Implementations/CombineLatest+arity.tt | 2 +- .../Implementations/Zip+CollectionType.swift | 2 +- .../Observables/Implementations/Zip+arity.swift | 14 +++++++------- RxSwift/Observables/Implementations/Zip+arity.tt | 2 +- 9 files changed, 21 insertions(+), 21 deletions(-) diff --git a/RxCocoa/Common/DelegateProxyType.swift b/RxCocoa/Common/DelegateProxyType.swift index 893ccb23..a669dfbc 100644 --- a/RxCocoa/Common/DelegateProxyType.swift +++ b/RxCocoa/Common/DelegateProxyType.swift @@ -273,6 +273,6 @@ extension ObservableType { } } - return CompositeDisposable(subscription, disposable) + return Disposables.create(subscription, disposable) } } diff --git a/RxExample/RxExample-iOSTests/TestScheduler+MarbleTests.swift b/RxExample/RxExample-iOSTests/TestScheduler+MarbleTests.swift index 5cd2e991..550797db 100644 --- a/RxExample/RxExample-iOSTests/TestScheduler+MarbleTests.swift +++ b/RxExample/RxExample-iOSTests/TestScheduler+MarbleTests.swift @@ -156,7 +156,7 @@ extension TestScheduler { attemptCount += 1 - return CompositeDisposable(disposables: scheduledEvents) + return Disposables.create(scheduledEvents) } } diff --git a/RxExample/RxExample/Examples/ImagePicker/UIImagePickerController+RxCreate.swift b/RxExample/RxExample/Examples/ImagePicker/UIImagePickerController+RxCreate.swift index 58b6f9b7..75e30797 100644 --- a/RxExample/RxExample/Examples/ImagePicker/UIImagePickerController+RxCreate.swift +++ b/RxExample/RxExample/Examples/ImagePicker/UIImagePickerController+RxCreate.swift @@ -56,7 +56,7 @@ extension UIImagePickerController { parent.present(imagePicker, animated: animated, completion: nil) observer.on(.next(imagePicker)) - return CompositeDisposable(dismissDisposable, AnonymousDisposable { + return Disposables.create(dismissDisposable, AnonymousDisposable { dismissViewController(imagePicker, animated: animated) }) } diff --git a/RxSwift/Observables/Implementations/CombineLatest+CollectionType.swift b/RxSwift/Observables/Implementations/CombineLatest+CollectionType.swift index fb5754ce..d4212fa8 100644 --- a/RxSwift/Observables/Implementations/CombineLatest+CollectionType.swift +++ b/RxSwift/Observables/Implementations/CombineLatest+CollectionType.swift @@ -100,7 +100,7 @@ class CombineLatestCollectionTypeSink : CombineLatestSink { subscription1.disposable = _parent._source1.subscribe(observer1) subscription2.disposable = _parent._source2.subscribe(observer2) - return CompositeDisposable(disposables: [ + return Disposables.create([ subscription1, subscription2 ]) @@ -142,7 +142,7 @@ class CombineLatestSink3_ : CombineLatestSink { subscription2.disposable = _parent._source2.subscribe(observer2) subscription3.disposable = _parent._source3.subscribe(observer3) - return CompositeDisposable(disposables: [ + return Disposables.create([ subscription1, subscription2, subscription3 @@ -234,7 +234,7 @@ class CombineLatestSink4_ : CombineLatestSink : CombineLatestSi subscription4.disposable = _parent._source4.subscribe(observer4) subscription5.disposable = _parent._source5.subscribe(observer5) - return CompositeDisposable(disposables: [ + return Disposables.create([ subscription1, subscription2, subscription3, @@ -439,7 +439,7 @@ class CombineLatestSink6_ : CombineLate subscription5.disposable = _parent._source5.subscribe(observer5) subscription6.disposable = _parent._source6.subscribe(observer6) - return CompositeDisposable(disposables: [ + return Disposables.create([ subscription1, subscription2, subscription3, @@ -552,7 +552,7 @@ class CombineLatestSink7_ : Combine subscription6.disposable = _parent._source6.subscribe(observer6) subscription7.disposable = _parent._source7.subscribe(observer7) - return CompositeDisposable(disposables: [ + return Disposables.create([ subscription1, subscription2, subscription3, @@ -672,7 +672,7 @@ class CombineLatestSink8_ : Com subscription7.disposable = _parent._source7.subscribe(observer7) subscription8.disposable = _parent._source8.subscribe(observer8) - return CompositeDisposable(disposables: [ + return Disposables.create([ subscription1, subscription2, subscription3, diff --git a/RxSwift/Observables/Implementations/CombineLatest+arity.tt b/RxSwift/Observables/Implementations/CombineLatest+arity.tt index 437384c9..624a241e 100644 --- a/RxSwift/Observables/Implementations/CombineLatest+arity.tt +++ b/RxSwift/Observables/Implementations/CombineLatest+arity.tt @@ -60,7 +60,7 @@ class CombineLatestSink<%= i %>_<<%= (Array(1...i).map { "E\($0)" }).joined(sepa " subscription\($0).disposable = _parent._source\($0).subscribe(observer\($0))" }).joined(separator: "\n") %> - return CompositeDisposable(disposables: [ + return Disposables.create([ <%= (Array(1...i).map { " subscription\($0)" }).joined(separator: ",\n") %> ]) } diff --git a/RxSwift/Observables/Implementations/Zip+CollectionType.swift b/RxSwift/Observables/Implementations/Zip+CollectionType.swift index 7c35a8a0..38d0cc4b 100644 --- a/RxSwift/Observables/Implementations/Zip+CollectionType.swift +++ b/RxSwift/Observables/Implementations/Zip+CollectionType.swift @@ -112,7 +112,7 @@ class ZipCollectionTypeSink : ZipSink { subscription1.disposable = _parent.source1.subscribe(observer1) subscription2.disposable = _parent.source2.subscribe(observer2) - return CompositeDisposable(disposables: [ + return Disposables.create([ subscription1, subscription2 ]) @@ -167,7 +167,7 @@ class ZipSink3_ : ZipSink { subscription2.disposable = _parent.source2.subscribe(observer2) subscription3.disposable = _parent.source3.subscribe(observer3) - return CompositeDisposable(disposables: [ + return Disposables.create([ subscription1, subscription2, subscription3 @@ -273,7 +273,7 @@ class ZipSink4_ : ZipSink { subscription3.disposable = _parent.source3.subscribe(observer3) subscription4.disposable = _parent.source4.subscribe(observer4) - return CompositeDisposable(disposables: [ + return Disposables.create([ subscription1, subscription2, subscription3, @@ -387,7 +387,7 @@ class ZipSink5_ : ZipSink { subscription4.disposable = _parent.source4.subscribe(observer4) subscription5.disposable = _parent.source5.subscribe(observer5) - return CompositeDisposable(disposables: [ + return Disposables.create([ subscription1, subscription2, subscription3, @@ -509,7 +509,7 @@ class ZipSink6_ : ZipSink { subscription5.disposable = _parent.source5.subscribe(observer5) subscription6.disposable = _parent.source6.subscribe(observer6) - return CompositeDisposable(disposables: [ + return Disposables.create([ subscription1, subscription2, subscription3, @@ -639,7 +639,7 @@ class ZipSink7_ : ZipSink { subscription6.disposable = _parent.source6.subscribe(observer6) subscription7.disposable = _parent.source7.subscribe(observer7) - return CompositeDisposable(disposables: [ + return Disposables.create([ subscription1, subscription2, subscription3, @@ -777,7 +777,7 @@ class ZipSink8_ : ZipSink { subscription7.disposable = _parent.source7.subscribe(observer7) subscription8.disposable = _parent.source8.subscribe(observer8) - return CompositeDisposable(disposables: [ + return Disposables.create([ subscription1, subscription2, subscription3, diff --git a/RxSwift/Observables/Implementations/Zip+arity.tt b/RxSwift/Observables/Implementations/Zip+arity.tt index 8e1e5e16..9af1dc7d 100644 --- a/RxSwift/Observables/Implementations/Zip+arity.tt +++ b/RxSwift/Observables/Implementations/Zip+arity.tt @@ -72,7 +72,7 @@ class ZipSink<%= i %>_<<%= (Array(1...i).map { "E\($0)" }).joined(separator: ", " subscription\($0).disposable = _parent.source\($0).subscribe(observer\($0))" }).joined(separator: "\n") %> - return CompositeDisposable(disposables: [ + return Disposables.create([ <%= (Array(1...i).map { " subscription\($0)" }).joined(separator: ",\n") %> ]) } From 341ef8fc3b843f62a16ba1c58e9cf166583bfd9c Mon Sep 17 00:00:00 2001 From: Mo Ramezanpoor Date: Wed, 10 Aug 2016 14:28:13 +0100 Subject: [PATCH 10/18] Rename `Disposables.empty()` to `.create()`. --- RxSwift/Disposables/Disposables.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/RxSwift/Disposables/Disposables.swift b/RxSwift/Disposables/Disposables.swift index a347929d..445b6a24 100644 --- a/RxSwift/Disposables/Disposables.swift +++ b/RxSwift/Disposables/Disposables.swift @@ -14,7 +14,7 @@ public struct Disposables { public extension Disposables { - static func empty() -> Disposable { + static func create() -> Disposable { return NopDisposable.instance } @@ -33,7 +33,7 @@ public extension Disposables { static func create(_ disposables: [Disposable]) -> Disposable { switch disposables.count { case 0: - return Disposables.empty() + return Disposables.create() case 1: return disposables[0] case 2: From 6d17e711ab6d2d04a39524950b0edc59fdf85e80 Mon Sep 17 00:00:00 2001 From: Mo Ramezanpoor Date: Wed, 10 Aug 2016 14:33:39 +0100 Subject: [PATCH 11/18] Changes implementation of two overloads of `Disposables.create()` to avoid deprecation warnings. --- RxSwift/Disposables/AnonymousDisposable.swift | 16 +++++++++++++++- RxSwift/Disposables/Disposables.swift | 8 +++----- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/RxSwift/Disposables/AnonymousDisposable.swift b/RxSwift/Disposables/AnonymousDisposable.swift index d6fbf601..b25070a8 100644 --- a/RxSwift/Disposables/AnonymousDisposable.swift +++ b/RxSwift/Disposables/AnonymousDisposable.swift @@ -36,7 +36,13 @@ public final class AnonymousDisposable : DisposeBase, Cancelable { _disposeAction = disposeAction super.init() } - + + // Non-deprecated version of the constructor, used by `Disposables.create(with:)` + private init(disposeAction: DisposeAction) { + _disposeAction = disposeAction + super.init() + } + /** Calls the disposal action if and only if the current instance hasn't been disposed yet. @@ -53,3 +59,11 @@ public final class AnonymousDisposable : DisposeBase, Cancelable { } } } + +public extension Disposables { + + static func create(with action: () -> ()) -> Disposable { + return AnonymousDisposable(disposeAction: action) + } + +} diff --git a/RxSwift/Disposables/Disposables.swift b/RxSwift/Disposables/Disposables.swift index 445b6a24..a786483a 100644 --- a/RxSwift/Disposables/Disposables.swift +++ b/RxSwift/Disposables/Disposables.swift @@ -14,12 +14,10 @@ public struct Disposables { public extension Disposables { - static func create() -> Disposable { - return NopDisposable.instance - } + private static let noOp: Disposable = NopDisposable() - static func create(with action: () -> ()) -> Disposable { - return AnonymousDisposable(action) + static func create() -> Disposable { + return noOp } static func create(_ disposable1: Disposable, _ disposable2: Disposable, _ disposable3: Disposable) -> Disposable { From a981d4caabb5c6baaae77180f763440f0e483835 Mon Sep 17 00:00:00 2001 From: Mo Ramezanpoor Date: Wed, 10 Aug 2016 14:43:51 +0100 Subject: [PATCH 12/18] Overloads `Disposables.create()` with a version accepting variadics after the third argument. --- RxSwift/Disposables/Disposables.swift | 8 ++++-- Tests/RxSwiftTests/Tests/DisposableTest.swift | 27 +++++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/RxSwift/Disposables/Disposables.swift b/RxSwift/Disposables/Disposables.swift index a786483a..d60cca8e 100644 --- a/RxSwift/Disposables/Disposables.swift +++ b/RxSwift/Disposables/Disposables.swift @@ -24,8 +24,12 @@ public extension Disposables { return CompositeDisposable(disposable1, disposable2, disposable3) } - static func create(_ disposable1: Disposable, _ disposable2: Disposable, _ disposable3: Disposable, _ disposable4: Disposable) -> Disposable { - return CompositeDisposable(disposable1, disposable2, disposable3, disposable4) + static func create(_ disposable1: Disposable, _ disposable2: Disposable, _ disposable3: Disposable, _ disposables: Disposable ...) -> Disposable { + var disposables = disposables + disposables.append(disposable1) + disposables.append(disposable2) + disposables.append(disposable3) + return CompositeDisposable(disposables: disposables) } static func create(_ disposables: [Disposable]) -> Disposable { diff --git a/Tests/RxSwiftTests/Tests/DisposableTest.swift b/Tests/RxSwiftTests/Tests/DisposableTest.swift index dead2cbe..95c7b30f 100644 --- a/Tests/RxSwiftTests/Tests/DisposableTest.swift +++ b/Tests/RxSwiftTests/Tests/DisposableTest.swift @@ -154,6 +154,33 @@ class DisposableTest : RxTest { XCTAssertEqual(compositeDisposable.count, 0) } + func testDisposables_TestCreateWithNumberOfDisposables() { + var numberDisposed = 0 + + let disposable1 = AnonymousDisposable { + numberDisposed += 1 + } + let disposable2 = AnonymousDisposable { + numberDisposed += 1 + } + let disposable3 = AnonymousDisposable { + numberDisposed += 1 + } + let disposable4 = AnonymousDisposable { + numberDisposed += 1 + } + let disposable5 = AnonymousDisposable { + numberDisposed += 1 + } + + let disposable = Disposables.create(disposable1, disposable2, disposable3, disposable4, disposable5) + + XCTAssertEqual(numberDisposed, 0) + + disposable.dispose() + XCTAssertEqual(numberDisposed, 5) + } + func testRefCountDisposable_RefCounting() { let d = BooleanDisposable() let r = RefCountDisposable(disposable: d) From 1fe15bb9dab3457a25c60149e1c84740b21cef97 Mon Sep 17 00:00:00 2001 From: Mo Ramezanpoor Date: Wed, 10 Aug 2016 14:47:53 +0100 Subject: [PATCH 13/18] Replaces all calls to `NopDisposable.instance` with `Disposables.create()`. --- Documentation/GettingStarted.md | 4 +- .../Contents.swift | 4 +- .../Contents.swift | 2 +- .../Contents.swift | 4 +- .../Contents.swift | 4 +- RxBlocking/RunLoopLock.swift | 2 +- RxCocoa/OSX/NSControl+Rx.swift | 4 +- RxCocoa/iOS/UIBarButtonItem+Rx.swift | 2 +- RxCocoa/iOS/UIControl+Rx.swift | 4 +- RxCocoa/iOS/UIGestureRecognizer+Rx.swift | 2 +- .../TestScheduler+MarbleTests.swift | 2 +- .../UIImagePickerController+RxCreate.swift | 4 +- RxSwift/Disposables/RefCountDisposable.swift | 2 +- RxSwift/Disposables/ScheduledDisposable.swift | 2 +- .../SingleAssignmentDisposable.swift | 2 +- RxSwift/ObservableType+Extensions.swift | 4 +- .../Observables/Implementations/Buffer.swift | 2 +- .../Implementations/Deferred.swift | 2 +- .../Observables/Implementations/Empty.swift | 2 +- .../Observables/Implementations/Error.swift | 2 +- .../Observables/Implementations/Just.swift | 4 +- .../Implementations/Multicast.swift | 2 +- .../Observables/Implementations/Never.swift | 2 +- .../ObserveOnSerialDispatchQueue.swift | 2 +- .../Implementations/ShareReplay1.swift | 2 +- .../Observables/Implementations/Skip.swift | 2 +- .../Implementations/SubscribeOn.swift | 2 +- .../Observables/Implementations/Take.swift | 2 +- .../Implementations/Throttle.swift | 2 +- .../Observables/Implementations/Timeout.swift | 2 +- .../Observables/Implementations/Timer.swift | 2 +- .../Observables/Implementations/Using.swift | 2 +- .../Observables/Implementations/Window.swift | 2 +- RxSwift/Schedulers/RecursiveScheduler.swift | 12 +++--- RxSwift/Subjects/BehaviorSubject.swift | 4 +- RxSwift/Subjects/PublishSubject.swift | 4 +- RxSwift/Subjects/ReplaySubject.swift | 4 +- RxTests/ColdObservable.swift | 2 +- RxTests/Schedulers/TestScheduler.swift | 8 ++-- Tests/PerformanceTests/main.swift | 2 +- Tests/RxCocoaTests/Driver+Test.swift | 4 +- Tests/RxCocoaTests/RxTest+Controls.swift | 2 +- .../Tests/AnonymousObservable+Test.swift | 6 +-- .../Tests/CurrentThreadSchedulerTest.swift | 12 +++--- .../Tests/HistoricalSchedulerTest.swift | 36 +++++++++--------- .../Tests/MainSchedulerTests.swift | 10 ++--- .../Tests/Observable+ConcurrencyTest.swift | 28 +++++++------- .../Tests/Observable+SingleTest.swift | 4 +- .../Tests/Observable+TimeTest.swift | 2 +- Tests/RxSwiftTests/Tests/ObserverTests.swift | 6 +-- Tests/RxSwiftTests/Tests/SchedulerTests.swift | 4 +- .../Tests/VirtualSchedulerTest.swift | 38 +++++++++---------- 52 files changed, 136 insertions(+), 136 deletions(-) diff --git a/Documentation/GettingStarted.md b/Documentation/GettingStarted.md index 9bc5d8b4..1f1380f0 100644 --- a/Documentation/GettingStarted.md +++ b/Documentation/GettingStarted.md @@ -293,7 +293,7 @@ func myJust(element: E) -> Observable { return Observable.create { observer in observer.on(.Next(element)) observer.on(.Completed) - return NopDisposable.instance + return Disposables.create() } } @@ -329,7 +329,7 @@ func myFrom(sequence: [E]) -> Observable { } observer.on(.Completed) - return NopDisposable.instance + return Disposables.create() } } diff --git a/Rx.playground/Pages/Creating_and_Subscribing_to_Observables.xcplaygroundpage/Contents.swift b/Rx.playground/Pages/Creating_and_Subscribing_to_Observables.xcplaygroundpage/Contents.swift index f7cbf79c..2d82494f 100644 --- a/Rx.playground/Pages/Creating_and_Subscribing_to_Observables.xcplaygroundpage/Contents.swift +++ b/Rx.playground/Pages/Creating_and_Subscribing_to_Observables.xcplaygroundpage/Contents.swift @@ -102,7 +102,7 @@ example("create") { return Observable.create { observer in observer.on(.next(element)) observer.on(.completed) - return NopDisposable.instance + return Disposables.create() } } @@ -170,7 +170,7 @@ example("deferred") { observer.onNext("🐶") observer.onNext("🐱") observer.onNext("🐵") - return NopDisposable.instance + return Disposables.create() } } diff --git a/Rx.playground/Pages/Debugging_Operators.xcplaygroundpage/Contents.swift b/Rx.playground/Pages/Debugging_Operators.xcplaygroundpage/Contents.swift index e2759149..b83b0905 100644 --- a/Rx.playground/Pages/Debugging_Operators.xcplaygroundpage/Contents.swift +++ b/Rx.playground/Pages/Debugging_Operators.xcplaygroundpage/Contents.swift @@ -34,7 +34,7 @@ example("debug") { observer.onNext("🐭") observer.onCompleted() - return NopDisposable.instance + return Disposables.create() } sequenceThatErrors diff --git a/Rx.playground/Pages/Error_Handling_Operators.xcplaygroundpage/Contents.swift b/Rx.playground/Pages/Error_Handling_Operators.xcplaygroundpage/Contents.swift index 782713a3..00570f86 100644 --- a/Rx.playground/Pages/Error_Handling_Operators.xcplaygroundpage/Contents.swift +++ b/Rx.playground/Pages/Error_Handling_Operators.xcplaygroundpage/Contents.swift @@ -85,7 +85,7 @@ example("retry") { observer.onNext("🐭") observer.onCompleted() - return NopDisposable.instance + return Disposables.create() } sequenceThatErrors @@ -119,7 +119,7 @@ example("retry maxAttemptCount") { observer.onNext("🐭") observer.onCompleted() - return NopDisposable.instance + return Disposables.create() } sequenceThatErrors diff --git a/Rx.playground/Pages/Introduction.xcplaygroundpage/Contents.swift b/Rx.playground/Pages/Introduction.xcplaygroundpage/Contents.swift index 49e5d685..80f529e7 100644 --- a/Rx.playground/Pages/Introduction.xcplaygroundpage/Contents.swift +++ b/Rx.playground/Pages/Introduction.xcplaygroundpage/Contents.swift @@ -58,7 +58,7 @@ example("Observable with no subscribers") { print("This will never be printed") observerOfString.on(.next("😬")) observerOfString.on(.completed) - return NopDisposable.instance + return Disposables.create() } } /*: @@ -70,7 +70,7 @@ example("Observable with subscriber") { print("Observable created") observerOfString.on(.next("😉")) observerOfString.on(.completed) - return NopDisposable.instance + return Disposables.create() } .subscribe { event in print(event) diff --git a/RxBlocking/RunLoopLock.swift b/RxBlocking/RunLoopLock.swift index 8b5eec73..6112ae88 100644 --- a/RxBlocking/RunLoopLock.swift +++ b/RxBlocking/RunLoopLock.swift @@ -43,7 +43,7 @@ class RunLoopLock { if CurrentThreadScheduler.isScheduleRequired { _ = CurrentThreadScheduler.instance.schedule(()) { _ in action() - return NopDisposable.instance + return Disposables.create() } } else { diff --git a/RxCocoa/OSX/NSControl+Rx.swift b/RxCocoa/OSX/NSControl+Rx.swift index 47bddd6e..2adeacef 100644 --- a/RxCocoa/OSX/NSControl+Rx.swift +++ b/RxCocoa/OSX/NSControl+Rx.swift @@ -29,7 +29,7 @@ extension NSControl { guard let control = self else { observer.on(.completed) - return NopDisposable.instance + return Disposables.create() } let observer = ControlTarget(control: control) { control in @@ -54,7 +54,7 @@ extension NSControl { return Observable.create { [weak weakControl = control] (observer: AnyObserver) in guard let control = weakControl else { observer.on(.completed) - return NopDisposable.instance + return Disposables.create() } observer.on(.next(getter(control))) diff --git a/RxCocoa/iOS/UIBarButtonItem+Rx.swift b/RxCocoa/iOS/UIBarButtonItem+Rx.swift index 4331b8f9..3b931c18 100644 --- a/RxCocoa/iOS/UIBarButtonItem+Rx.swift +++ b/RxCocoa/iOS/UIBarButtonItem+Rx.swift @@ -34,7 +34,7 @@ extension UIBarButtonItem { Observable.create { [weak self] observer in guard let control = self else { observer.on(.completed) - return NopDisposable.instance + return Disposables.create() } let target = BarButtonItemTarget(barButtonItem: control) { observer.on(.next()) diff --git a/RxCocoa/iOS/UIControl+Rx.swift b/RxCocoa/iOS/UIControl+Rx.swift index cc1b8350..6f98323f 100644 --- a/RxCocoa/iOS/UIControl+Rx.swift +++ b/RxCocoa/iOS/UIControl+Rx.swift @@ -45,7 +45,7 @@ extension UIControl { guard let control = self else { observer.on(.completed) - return NopDisposable.instance + return Disposables.create() } let controlTarget = ControlTarget(control: control, controlEvents: controlEvents) { @@ -67,7 +67,7 @@ extension UIControl { let source: Observable = Observable.create { [weak weakControl = control] observer in guard let control = weakControl else { observer.on(.completed) - return NopDisposable.instance + return Disposables.create() } observer.on(.next(getter(control))) diff --git a/RxCocoa/iOS/UIGestureRecognizer+Rx.swift b/RxCocoa/iOS/UIGestureRecognizer+Rx.swift index 92858887..82b3fcd0 100644 --- a/RxCocoa/iOS/UIGestureRecognizer+Rx.swift +++ b/RxCocoa/iOS/UIGestureRecognizer+Rx.swift @@ -64,7 +64,7 @@ extension Reactive where Self: UIGestureRecognizer { guard let control = self else { observer.on(.completed) - return NopDisposable.instance + return Disposables.create() } let observer = GestureTarget(control) { diff --git a/RxExample/RxExample-iOSTests/TestScheduler+MarbleTests.swift b/RxExample/RxExample-iOSTests/TestScheduler+MarbleTests.swift index 550797db..8f41a873 100644 --- a/RxExample/RxExample-iOSTests/TestScheduler+MarbleTests.swift +++ b/RxExample/RxExample-iOSTests/TestScheduler+MarbleTests.swift @@ -150,7 +150,7 @@ extension TestScheduler { let scheduledEvents = events[attemptCount].map { event in return self.scheduleRelative((), dueTime: resolution * TimeInterval(event.time)) { _ in observer.on(event.value) - return NopDisposable.instance + return Disposables.create() } } diff --git a/RxExample/RxExample/Examples/ImagePicker/UIImagePickerController+RxCreate.swift b/RxExample/RxExample/Examples/ImagePicker/UIImagePickerController+RxCreate.swift index 75e30797..134d71b2 100644 --- a/RxExample/RxExample/Examples/ImagePicker/UIImagePickerController+RxCreate.swift +++ b/RxExample/RxExample/Examples/ImagePicker/UIImagePickerController+RxCreate.swift @@ -45,12 +45,12 @@ extension UIImagePickerController { } catch let error { observer.on(.error(error)) - return NopDisposable.instance + return Disposables.create() } guard let parent = parent else { observer.on(.completed) - return NopDisposable.instance + return Disposables.create() } parent.present(imagePicker, animated: animated, completion: nil) diff --git a/RxSwift/Disposables/RefCountDisposable.swift b/RxSwift/Disposables/RefCountDisposable.swift index 25769f1d..f2e5f9fe 100644 --- a/RxSwift/Disposables/RefCountDisposable.swift +++ b/RxSwift/Disposables/RefCountDisposable.swift @@ -50,7 +50,7 @@ public final class RefCountDisposable : DisposeBase, Cancelable { return RefCountInnerDisposable(self) } else { - return NopDisposable.instance + return Disposables.create() } } } diff --git a/RxSwift/Disposables/ScheduledDisposable.swift b/RxSwift/Disposables/ScheduledDisposable.swift index 03b5d818..a3685785 100644 --- a/RxSwift/Disposables/ScheduledDisposable.swift +++ b/RxSwift/Disposables/ScheduledDisposable.swift @@ -10,7 +10,7 @@ import Foundation private let disposeScheduledDisposable: (ScheduledDisposable) -> Disposable = { sd in sd.disposeInner() - return NopDisposable.instance + return Disposables.create() } /** diff --git a/RxSwift/Disposables/SingleAssignmentDisposable.swift b/RxSwift/Disposables/SingleAssignmentDisposable.swift index a18ad82b..32332957 100644 --- a/RxSwift/Disposables/SingleAssignmentDisposable.swift +++ b/RxSwift/Disposables/SingleAssignmentDisposable.swift @@ -43,7 +43,7 @@ public class SingleAssignmentDisposable : DisposeBase, Disposable, Cancelable { public var disposable: Disposable { get { _lock.lock(); defer { _lock.unlock() } - return _disposable ?? NopDisposable.instance + return _disposable ?? Disposables.create() } set { _setDisposable(newValue)?.dispose() diff --git a/RxSwift/ObservableType+Extensions.swift b/RxSwift/ObservableType+Extensions.swift index bfed0064..18b72e00 100644 --- a/RxSwift/ObservableType+Extensions.swift +++ b/RxSwift/ObservableType+Extensions.swift @@ -45,7 +45,7 @@ extension ObservableType { disposable = AnonymousDisposable(disposed) } else { - disposable = NopDisposable.instance + disposable = Disposables.create() } let observer = AnonymousObserver { e in @@ -91,7 +91,7 @@ extension ObservableType { disposable = AnonymousDisposable(disposed) } else { - disposable = NopDisposable.instance + disposable = Disposables.create() } let observer = AnonymousObserver { e in diff --git a/RxSwift/Observables/Implementations/Buffer.swift b/RxSwift/Observables/Implementations/Buffer.swift index 823a4bcb..5025e81a 100644 --- a/RxSwift/Observables/Implementations/Buffer.swift +++ b/RxSwift/Observables/Implementations/Buffer.swift @@ -113,7 +113,7 @@ class BufferTimeCountSink self.startNewWindowAndSendCurrentOne() } - return NopDisposable.instance + return Disposables.create() } } } diff --git a/RxSwift/Observables/Implementations/Deferred.swift b/RxSwift/Observables/Implementations/Deferred.swift index bbcf8cda..bea825c3 100644 --- a/RxSwift/Observables/Implementations/Deferred.swift +++ b/RxSwift/Observables/Implementations/Deferred.swift @@ -26,7 +26,7 @@ class DeferredSink : Sink : Producer { override func subscribe(_ observer: O) -> Disposable { observer.on(.completed) - return NopDisposable.instance + return Disposables.create() } } diff --git a/RxSwift/Observables/Implementations/Error.swift b/RxSwift/Observables/Implementations/Error.swift index e1322c35..42484cab 100644 --- a/RxSwift/Observables/Implementations/Error.swift +++ b/RxSwift/Observables/Implementations/Error.swift @@ -17,6 +17,6 @@ class Error : Producer { override func subscribe(_ observer: O) -> Disposable { observer.on(.error(_error)) - return NopDisposable.instance + return Disposables.create() } } diff --git a/RxSwift/Observables/Implementations/Just.swift b/RxSwift/Observables/Implementations/Just.swift index 256446ae..b8dcce7b 100644 --- a/RxSwift/Observables/Implementations/Just.swift +++ b/RxSwift/Observables/Implementations/Just.swift @@ -24,7 +24,7 @@ class JustScheduledSink : Sink { self.forwardOn(.next(element)) return scheduler.schedule(()) { _ in self.forwardOn(.completed) - return NopDisposable.instance + return Disposables.create() } } } @@ -56,6 +56,6 @@ class Just : Producer { override func subscribe(_ observer: O) -> Disposable { observer.on(.next(_element)) observer.on(.completed) - return NopDisposable.instance + return Disposables.create() } } diff --git a/RxSwift/Observables/Implementations/Multicast.swift b/RxSwift/Observables/Implementations/Multicast.swift index 6bf7a116..dbdec380 100644 --- a/RxSwift/Observables/Implementations/Multicast.swift +++ b/RxSwift/Observables/Implementations/Multicast.swift @@ -35,7 +35,7 @@ class MulticastSink: Sink, ObserverType { catch let e { forwardOn(.error(e)) dispose() - return NopDisposable.instance + return Disposables.create() } } diff --git a/RxSwift/Observables/Implementations/Never.swift b/RxSwift/Observables/Implementations/Never.swift index 60ed522a..e0ac7d8f 100644 --- a/RxSwift/Observables/Implementations/Never.swift +++ b/RxSwift/Observables/Implementations/Never.swift @@ -10,6 +10,6 @@ import Foundation class Never : Producer { override func subscribe(_ observer: O) -> Disposable { - return NopDisposable.instance + return Disposables.create() } } diff --git a/RxSwift/Observables/Implementations/ObserveOnSerialDispatchQueue.swift b/RxSwift/Observables/Implementations/ObserveOnSerialDispatchQueue.swift index fa6a89a0..4d352525 100644 --- a/RxSwift/Observables/Implementations/ObserveOnSerialDispatchQueue.swift +++ b/RxSwift/Observables/Implementations/ObserveOnSerialDispatchQueue.swift @@ -37,7 +37,7 @@ class ObserveOnSerialDispatchQueueSink : ObserverBase { sink.dispose() } - return NopDisposable.instance + return Disposables.create() } } diff --git a/RxSwift/Observables/Implementations/ShareReplay1.swift b/RxSwift/Observables/Implementations/ShareReplay1.swift index 1df1fe57..23853a9f 100644 --- a/RxSwift/Observables/Implementations/ShareReplay1.swift +++ b/RxSwift/Observables/Implementations/ShareReplay1.swift @@ -42,7 +42,7 @@ final class ShareReplay1 if let stopEvent = self._stopEvent { observer.on(stopEvent) - return NopDisposable.instance + return Disposables.create() } let initialCount = self._observers.count diff --git a/RxSwift/Observables/Implementations/Skip.swift b/RxSwift/Observables/Implementations/Skip.swift index 4e2a2034..9d13c5e4 100644 --- a/RxSwift/Observables/Implementations/Skip.swift +++ b/RxSwift/Observables/Implementations/Skip.swift @@ -100,7 +100,7 @@ class SkipTimeSink : Sink func run() -> Disposable { let disposeTimer = parent.scheduler.scheduleRelative((), dueTime: self.parent.duration) { self.tick() - return NopDisposable.instance + return Disposables.create() } let disposeSubscription = parent.source.subscribe(self) diff --git a/RxSwift/Observables/Implementations/SubscribeOn.swift b/RxSwift/Observables/Implementations/SubscribeOn.swift index 9ba48f2f..ac4bb84e 100644 --- a/RxSwift/Observables/Implementations/SubscribeOn.swift +++ b/RxSwift/Observables/Implementations/SubscribeOn.swift @@ -36,7 +36,7 @@ class SubscribeOnSink : S cancelSchedule.disposable = parent.scheduler.schedule(()) { (_) -> Disposable in let subscription = self.parent.source.subscribe(self) disposeEverything.disposable = ScheduledDisposable(scheduler: self.parent.scheduler, disposable: subscription) - return NopDisposable.instance + return Disposables.create() } return disposeEverything diff --git a/RxSwift/Observables/Implementations/Take.swift b/RxSwift/Observables/Implementations/Take.swift index 855d77ec..6e8d9d4b 100644 --- a/RxSwift/Observables/Implementations/Take.swift +++ b/RxSwift/Observables/Implementations/Take.swift @@ -114,7 +114,7 @@ class TakeTimeSink func run() -> Disposable { let disposeTimer = _parent._scheduler.scheduleRelative((), dueTime: _parent._duration) { self.tick() - return NopDisposable.instance + return Disposables.create() } let disposeSubscription = _parent._source.subscribe(self) diff --git a/RxSwift/Observables/Implementations/Throttle.swift b/RxSwift/Observables/Implementations/Throttle.swift index e0197c4d..f85bb6f7 100644 --- a/RxSwift/Observables/Implementations/Throttle.swift +++ b/RxSwift/Observables/Implementations/Throttle.swift @@ -79,7 +79,7 @@ class ThrottleSink forwardOn(.next(value)) } // } - return NopDisposable.instance + return Disposables.create() } } diff --git a/RxSwift/Observables/Implementations/Timeout.swift b/RxSwift/Observables/Implementations/Timeout.swift index b6f9d21c..5c586e36 100644 --- a/RxSwift/Observables/Implementations/Timeout.swift +++ b/RxSwift/Observables/Implementations/Timeout.swift @@ -92,7 +92,7 @@ class TimeoutSink: Sink : Sink { self.forwardOn(.next(0)) self.forwardOn(.completed) - return NopDisposable.instance + return Disposables.create() } } } diff --git a/RxSwift/Observables/Implementations/Using.swift b/RxSwift/Observables/Implementations/Using.swift index 2252717c..a3d4d176 100644 --- a/RxSwift/Observables/Implementations/Using.swift +++ b/RxSwift/Observables/Implementations/Using.swift @@ -21,7 +21,7 @@ class UsingSink Disposable { - var disposable = NopDisposable.instance + var disposable = Disposables.create() do { let resource = try _parent._resourceFactory() diff --git a/RxSwift/Observables/Implementations/Window.swift b/RxSwift/Observables/Implementations/Window.swift index bdb4f895..9b155dc8 100644 --- a/RxSwift/Observables/Implementations/Window.swift +++ b/RxSwift/Observables/Implementations/Window.swift @@ -125,7 +125,7 @@ class WindowTimeCountSink { let d = _scheduler.scheduleRelative(state, dueTime: dueTime) { (state) -> Disposable in // best effort if self._group.disposed { - return NopDisposable.instance + return Disposables.create() } let action = self._lock.calculateLocked { () -> Action? in @@ -60,7 +60,7 @@ class AnyRecursiveScheduler { action(state: state, scheduler: self) } - return NopDisposable.instance + return Disposables.create() } _lock.performLocked { @@ -85,7 +85,7 @@ class AnyRecursiveScheduler { let d = _scheduler.schedule(state) { (state) -> Disposable in // best effort if self._group.disposed { - return NopDisposable.instance + return Disposables.create() } let action = self._lock.calculateLocked { () -> Action? in @@ -103,7 +103,7 @@ class AnyRecursiveScheduler { action(state: state, scheduler: self) } - return NopDisposable.instance + return Disposables.create() } _lock.performLocked { @@ -155,7 +155,7 @@ class RecursiveImmediateScheduler { let d = _scheduler.schedule(state) { (state) -> Disposable in // best effort if self._group.disposed { - return NopDisposable.instance + return Disposables.create() } let action = self._lock.calculateLocked { () -> Action? in @@ -173,7 +173,7 @@ class RecursiveImmediateScheduler { action(state: state, recurse: self.schedule) } - return NopDisposable.instance + return Disposables.create() } _lock.performLocked { diff --git a/RxSwift/Subjects/BehaviorSubject.swift b/RxSwift/Subjects/BehaviorSubject.swift index b9b7e0b3..ea9f519c 100644 --- a/RxSwift/Subjects/BehaviorSubject.swift +++ b/RxSwift/Subjects/BehaviorSubject.swift @@ -114,12 +114,12 @@ public final class BehaviorSubject func _synchronized_subscribe(_ observer: O) -> Disposable { if _disposed { observer.on(.error(RxError.disposed(object: self))) - return NopDisposable.instance + return Disposables.create() } if let stoppedEvent = _stoppedEvent { observer.on(stoppedEvent) - return NopDisposable.instance + return Disposables.create() } let key = _observers.insert(observer.asObserver()) diff --git a/RxSwift/Subjects/PublishSubject.swift b/RxSwift/Subjects/PublishSubject.swift index 8404c4a6..35103f4b 100644 --- a/RxSwift/Subjects/PublishSubject.swift +++ b/RxSwift/Subjects/PublishSubject.swift @@ -95,12 +95,12 @@ final public class PublishSubject func _synchronized_subscribe(_ observer: O) -> Disposable { if let stoppedEvent = _stoppedEvent { observer.on(stoppedEvent) - return NopDisposable.instance + return Disposables.create() } if _disposed { observer.on(.error(RxError.disposed(object: self))) - return NopDisposable.instance + return Disposables.create() } let key = _observers.insert(observer.asObserver()) diff --git a/RxSwift/Subjects/ReplaySubject.swift b/RxSwift/Subjects/ReplaySubject.swift index 88401783..b609a85d 100644 --- a/RxSwift/Subjects/ReplaySubject.swift +++ b/RxSwift/Subjects/ReplaySubject.swift @@ -139,7 +139,7 @@ class ReplayBufferBase func _synchronized_subscribe(_ observer: O) -> Disposable { if _disposed { observer.on(.error(RxError.disposed(object: self))) - return NopDisposable.instance + return Disposables.create() } let AnyObserver = observer.asObserver() @@ -147,7 +147,7 @@ class ReplayBufferBase replayBuffer(AnyObserver) if let stoppedEvent = _stoppedEvent { observer.on(stoppedEvent) - return NopDisposable.instance + return Disposables.create() } else { let key = _observers.insert(AnyObserver) diff --git a/RxTests/ColdObservable.swift b/RxTests/ColdObservable.swift index 647b21f2..53de66f3 100644 --- a/RxTests/ColdObservable.swift +++ b/RxTests/ColdObservable.swift @@ -33,7 +33,7 @@ class ColdObservable for recordedEvent in recordedEvents { _ = testScheduler.scheduleRelativeVirtual((), dueTime: recordedEvent.time, action: { (_) in observer.on(recordedEvent.value) - return NopDisposable.instance + return Disposables.create() }) } diff --git a/RxTests/Schedulers/TestScheduler.swift b/RxTests/Schedulers/TestScheduler.swift index 5a9e4441..f5d3535a 100644 --- a/RxTests/Schedulers/TestScheduler.swift +++ b/RxTests/Schedulers/TestScheduler.swift @@ -84,7 +84,7 @@ public class TestScheduler : VirtualTimeScheduler Void) { _ = self.scheduleAbsoluteVirtual((), time: time, action: { () -> Disposable in action() - return NopDisposable.instance + return Disposables.create() }) } @@ -111,17 +111,17 @@ public class TestScheduler : VirtualTimeScheduler(_ createControl: () -> C, _ eventSelector: (C) -> ControlEvent) { - return ensureEventDeallocated({ () -> (C, Disposable) in (createControl(), NopDisposable.instance) }, eventSelector) + return ensureEventDeallocated({ () -> (C, Disposable) in (createControl(), Disposables.create()) }, eventSelector) } func ensureEventDeallocated(_ createControl: () -> (C, Disposable), _ eventSelector: (C) -> ControlEvent) { diff --git a/Tests/RxSwiftTests/Tests/AnonymousObservable+Test.swift b/Tests/RxSwiftTests/Tests/AnonymousObservable+Test.swift index 82059332..dbe92c71 100644 --- a/Tests/RxSwiftTests/Tests/AnonymousObservable+Test.swift +++ b/Tests/RxSwiftTests/Tests/AnonymousObservable+Test.swift @@ -19,7 +19,7 @@ extension AnonymousObservableTests { var observer: AnyObserver! let a = Observable.create { o in observer = o - return NopDisposable.instance + return Disposables.create() } as Observable var elements = [Int]() @@ -43,7 +43,7 @@ extension AnonymousObservableTests { var observer: AnyObserver! let a = Observable.create { o in observer = o - return NopDisposable.instance + return Disposables.create() } as Observable var elements = [Int]() @@ -67,7 +67,7 @@ extension AnonymousObservableTests { var observer: AnyObserver! let a = Observable.create { o in observer = o - return NopDisposable.instance + return Disposables.create() } as Observable var elements = [Int]() diff --git a/Tests/RxSwiftTests/Tests/CurrentThreadSchedulerTest.swift b/Tests/RxSwiftTests/Tests/CurrentThreadSchedulerTest.swift index 7a202226..c4e4aaec 100644 --- a/Tests/RxSwiftTests/Tests/CurrentThreadSchedulerTest.swift +++ b/Tests/RxSwiftTests/Tests/CurrentThreadSchedulerTest.swift @@ -23,7 +23,7 @@ extension CurrentThreadSchedulerTest { _ = CurrentThreadScheduler.instance.schedule(()) { s in executed = true XCTAssertTrue(!CurrentThreadScheduler.isScheduleRequired) - return NopDisposable.instance + return Disposables.create() } XCTAssertTrue(executed) @@ -40,13 +40,13 @@ extension CurrentThreadSchedulerTest { messages.append(3) _ = CurrentThreadScheduler.instance.schedule(()) { messages.append(5) - return NopDisposable.instance + return Disposables.create() } messages.append(4) - return NopDisposable.instance + return Disposables.create() } messages.append(2) - return NopDisposable.instance + return Disposables.create() } XCTAssertEqual(messages, [1, 2, 3, 4, 5]) @@ -63,7 +63,7 @@ extension CurrentThreadSchedulerTest { messages.append(3) let disposable = CurrentThreadScheduler.instance.schedule(()) { messages.append(5) - return NopDisposable.instance + return Disposables.create() } disposable.dispose() messages.append(4) @@ -87,7 +87,7 @@ extension CurrentThreadSchedulerTest { messages.append(3) let disposable = CurrentThreadScheduler.instance.schedule(()) { messages.append(5) - return NopDisposable.instance + return Disposables.create() } messages.append(4) return disposable diff --git a/Tests/RxSwiftTests/Tests/HistoricalSchedulerTest.swift b/Tests/RxSwiftTests/Tests/HistoricalSchedulerTest.swift index 9e4e6421..19cf5424 100644 --- a/Tests/RxSwiftTests/Tests/HistoricalSchedulerTest.swift +++ b/Tests/RxSwiftTests/Tests/HistoricalSchedulerTest.swift @@ -30,11 +30,11 @@ extension HistoricalSchedulerTest { times.append(scheduler.now) _ = scheduler.scheduleRelative((), dueTime: 20.0) { _ in times.append(scheduler.now) - return NopDisposable.instance + return Disposables.create() } return scheduler.schedule(()) { _ in times.append(scheduler.now) - return NopDisposable.instance + return Disposables.create() } } @@ -56,16 +56,16 @@ extension HistoricalSchedulerTest { times.append(scheduler.now) let d = scheduler.scheduleRelative((), dueTime: 20.0) { _ in times.append(scheduler.now) - return NopDisposable.instance + return Disposables.create() } let d2 = scheduler.schedule(()) { _ in times.append(scheduler.now) - return NopDisposable.instance + return Disposables.create() } d2.dispose() d.dispose() - return NopDisposable.instance + return Disposables.create() } scheduler.start() @@ -84,11 +84,11 @@ extension HistoricalSchedulerTest { times.append(scheduler.now) _ = scheduler.scheduleRelative((), dueTime: 20.0) { _ in times.append(scheduler.now) - return NopDisposable.instance + return Disposables.create() } return scheduler.schedule(()) { _ in times.append(scheduler.now) - return NopDisposable.instance + return Disposables.create() } } @@ -110,11 +110,11 @@ extension HistoricalSchedulerTest { times.append(scheduler!.now) _ = scheduler!.scheduleRelative((), dueTime: 20.0) { _ in times.append(scheduler!.now) - return NopDisposable.instance + return Disposables.create() } return scheduler!.schedule(()) { _ in times.append(scheduler!.now) - return NopDisposable.instance + return Disposables.create() } } @@ -135,16 +135,16 @@ extension HistoricalSchedulerTest { times.append(scheduler!.now) let d1 = scheduler!.scheduleRelative((), dueTime: 20.0) { _ in times.append(scheduler!.now) - return NopDisposable.instance + return Disposables.create() } let d2 = scheduler!.schedule(()) { _ in times.append(scheduler!.now) - return NopDisposable.instance + return Disposables.create() } d1.dispose() d2.dispose() - return NopDisposable.instance + return Disposables.create() } scheduler.advanceTo(Date(timeIntervalSince1970: 200.0)) @@ -163,16 +163,16 @@ extension HistoricalSchedulerTest { times.append(scheduler!.now) _ = scheduler!.scheduleRelative((), dueTime: 20.0) { _ in times.append(scheduler!.now) - return NopDisposable.instance + return Disposables.create() } _ = scheduler!.schedule(()) { _ in times.append(scheduler!.now) - return NopDisposable.instance + return Disposables.create() } scheduler!.stop() - return NopDisposable.instance + return Disposables.create() } scheduler.start() @@ -193,15 +193,15 @@ extension HistoricalSchedulerTest { _ = scheduler!.sleep(100) _ = scheduler!.scheduleRelative((), dueTime: 20.0) { _ in times.append(scheduler!.now) - return NopDisposable.instance + return Disposables.create() } _ = scheduler!.schedule(()) { _ in times.append(scheduler!.now) - return NopDisposable.instance + return Disposables.create() } - return NopDisposable.instance + return Disposables.create() } scheduler.start() diff --git a/Tests/RxSwiftTests/Tests/MainSchedulerTests.swift b/Tests/RxSwiftTests/Tests/MainSchedulerTests.swift index a3fa8eba..f6bed574 100644 --- a/Tests/RxSwiftTests/Tests/MainSchedulerTests.swift +++ b/Tests/RxSwiftTests/Tests/MainSchedulerTests.swift @@ -41,13 +41,13 @@ extension MainSchedulerTest { messages.append(3) _ = MainScheduler.instance.schedule(()) { messages.append(5) - return NopDisposable.instance + return Disposables.create() } messages.append(4) - return NopDisposable.instance + return Disposables.create() } messages.append(2) - return NopDisposable.instance + return Disposables.create() } XCTAssertTrue(executedImmediatelly) @@ -66,7 +66,7 @@ extension MainSchedulerTest { messages.append(3) let disposable = MainScheduler.instance.schedule(()) { messages.append(5) - return NopDisposable.instance + return Disposables.create() } disposable.dispose() messages.append(4) @@ -90,7 +90,7 @@ extension MainSchedulerTest { messages.append(3) let disposable = MainScheduler.instance.schedule(()) { messages.append(5) - return NopDisposable.instance + return Disposables.create() } messages.append(4) return disposable diff --git a/Tests/RxSwiftTests/Tests/Observable+ConcurrencyTest.swift b/Tests/RxSwiftTests/Tests/Observable+ConcurrencyTest.swift index 9665608b..ca1f6ce5 100644 --- a/Tests/RxSwiftTests/Tests/Observable+ConcurrencyTest.swift +++ b/Tests/RxSwiftTests/Tests/Observable+ConcurrencyTest.swift @@ -44,7 +44,7 @@ extension ObservableConcurrencyTest { _ = scheduler.schedule(()) { s in expectation.fulfill() - return NopDisposable.instance + return Disposables.create() } waitForExpectations(timeout: 1.0) { e in @@ -95,7 +95,7 @@ extension ObservableConcurrencyTest { .observeOn(scheduler) XCTAssertTrue(a == a) // shut up swift compiler :(, we only need to keep this in memory XCTAssert(numberOfSerialDispatchQueueObservables == 1) - return NopDisposable.instance + return Disposables.create() } XCTAssert(numberOfSerialDispatchQueueObservables == 0) @@ -111,11 +111,11 @@ extension ObservableConcurrencyTest { self.sleep(0.1) // should be enough to block the queue, so if it's concurrent, it will fail XCTAssert(OSAtomicDecrement32(&numberOfConcurrentEvents) == 0) OSAtomicIncrement32(&numberOfExecutions) - return NopDisposable.instance + return Disposables.create() } _ = scheduler.schedule((), action: action) _ = scheduler.schedule((), action: action) - return NopDisposable.instance + return Disposables.create() } XCTAssert(numberOfSerialDispatchQueueObservables == 0) @@ -179,7 +179,7 @@ extension ObservableConcurrencyTest { ]) xs.on(.next(1)) xs.on(.next(2)) - return NopDisposable.instance + return Disposables.create() }, { scheduler in XCTAssertEqual(observer.events, [ @@ -189,7 +189,7 @@ extension ObservableConcurrencyTest { ]) XCTAssert(xs.subscriptions == [SubscribedToHotObservable]) xs.on(.completed) - return NopDisposable.instance + return Disposables.create() }, { scheduler in XCTAssertEqual(observer.events, [ @@ -199,7 +199,7 @@ extension ObservableConcurrencyTest { completed() ]) XCTAssert(xs.subscriptions == [UnsunscribedFromHotObservable]) - return NopDisposable.instance + return Disposables.create() }, ]) } @@ -220,7 +220,7 @@ extension ObservableConcurrencyTest { completed() ]) XCTAssert(xs.subscriptions == [UnsunscribedFromHotObservable]) - return NopDisposable.instance + return Disposables.create() } ]) } @@ -243,7 +243,7 @@ extension ObservableConcurrencyTest { ]) xs.on(.next(1)) xs.on(.next(2)) - return NopDisposable.instance + return Disposables.create() }, { scheduler in XCTAssertEqual(observer.events, [ @@ -253,7 +253,7 @@ extension ObservableConcurrencyTest { ]) XCTAssert(xs.subscriptions == [SubscribedToHotObservable]) xs.on(.error(testError)) - return NopDisposable.instance + return Disposables.create() }, { scheduler in XCTAssertEqual(observer.events, [ @@ -263,7 +263,7 @@ extension ObservableConcurrencyTest { error(testError) ]) XCTAssert(xs.subscriptions == [UnsunscribedFromHotObservable]) - return NopDisposable.instance + return Disposables.create() }, ]) } @@ -292,14 +292,14 @@ extension ObservableConcurrencyTest { xs.on(.error(testError)) - return NopDisposable.instance + return Disposables.create() }, { scheduler in XCTAssertEqual(observer.events, [ next(0), ]) XCTAssert(xs.subscriptions == [UnsunscribedFromHotObservable]) - return NopDisposable.instance + return Disposables.create() } ]) } @@ -364,7 +364,7 @@ class ObservableConcurrentSchedulerConcurrencyTest: ObservableConcurrencyTestBas stop.on(.completed) - return NopDisposable.instance + return Disposables.create() } _ = scheduler.schedule((), action: concurrent) diff --git a/Tests/RxSwiftTests/Tests/Observable+SingleTest.swift b/Tests/RxSwiftTests/Tests/Observable+SingleTest.swift index e7d04c21..ad6d823f 100644 --- a/Tests/RxSwiftTests/Tests/Observable+SingleTest.swift +++ b/Tests/RxSwiftTests/Tests/Observable+SingleTest.swift @@ -985,7 +985,7 @@ extension ObservableSingleTest { observer.on(.next(5)) observer.on(.completed) - return NopDisposable.instance + return Disposables.create() } _ = sequenceSendingImmediateError @@ -1377,7 +1377,7 @@ extension ObservableSingleTest { observer.on(.next(5)) observer.on(.completed) - return NopDisposable.instance + return Disposables.create() } _ = sequenceSendingImmediateError diff --git a/Tests/RxSwiftTests/Tests/Observable+TimeTest.swift b/Tests/RxSwiftTests/Tests/Observable+TimeTest.swift index 1a68a0df..50187435 100644 --- a/Tests/RxSwiftTests/Tests/Observable+TimeTest.swift +++ b/Tests/RxSwiftTests/Tests/Observable+TimeTest.swift @@ -560,7 +560,7 @@ extension ObservableTimeTest { _ = scheduler.schedule(()) { _ in cleanResources.fulfill() - return NopDisposable.instance + return Disposables.create() } waitForExpectations(timeout: 1.0) { e in diff --git a/Tests/RxSwiftTests/Tests/ObserverTests.swift b/Tests/RxSwiftTests/Tests/ObserverTests.swift index 543c8c9b..291ed976 100644 --- a/Tests/RxSwiftTests/Tests/ObserverTests.swift +++ b/Tests/RxSwiftTests/Tests/ObserverTests.swift @@ -18,7 +18,7 @@ extension ObserverTests { var observer: AnyObserver! let a: Observable = Observable.create { o in observer = o - return NopDisposable.instance + return Disposables.create() } var elements = [Int]() @@ -38,7 +38,7 @@ extension ObserverTests { var observer: AnyObserver! let a: Observable = Observable.create { o in observer = o - return NopDisposable.instance + return Disposables.create() } var elements = [Int]() @@ -67,7 +67,7 @@ extension ObserverTests { var observer: AnyObserver! let a: Observable = Observable.create { o in observer = o - return NopDisposable.instance + return Disposables.create() } var elements = [Int]() diff --git a/Tests/RxSwiftTests/Tests/SchedulerTests.swift b/Tests/RxSwiftTests/Tests/SchedulerTests.swift index 50a4de4e..54e1b418 100644 --- a/Tests/RxSwiftTests/Tests/SchedulerTests.swift +++ b/Tests/RxSwiftTests/Tests/SchedulerTests.swift @@ -37,7 +37,7 @@ extension ConcurrentDispatchQueueSchedulerTests { _ = scheduler.scheduleRelative(1, dueTime: 0.5) { (_) -> Disposable in interval = Date().timeIntervalSince(start) expectScheduling.fulfill() - return NopDisposable.instance + return Disposables.create() } waitForExpectations(timeout: 1.0) { error in @@ -58,7 +58,7 @@ extension ConcurrentDispatchQueueSchedulerTests { let disposable = scheduler.scheduleRelative(1, dueTime: 0.1) { (_) -> Disposable in interval = Date().timeIntervalSince(start) expectScheduling.fulfill() - return NopDisposable.instance + return Disposables.create() } disposable.dispose() diff --git a/Tests/RxSwiftTests/Tests/VirtualSchedulerTest.swift b/Tests/RxSwiftTests/Tests/VirtualSchedulerTest.swift index fb6a6593..d4153812 100644 --- a/Tests/RxSwiftTests/Tests/VirtualSchedulerTest.swift +++ b/Tests/RxSwiftTests/Tests/VirtualSchedulerTest.swift @@ -33,11 +33,11 @@ extension VirtualSchedulerTest { times.append(scheduler.clock) _ = scheduler.scheduleRelative((), dueTime: 20.0) { _ in times.append(scheduler.clock) - return NopDisposable.instance + return Disposables.create() } return scheduler.schedule(()) { _ in times.append(scheduler.clock) - return NopDisposable.instance + return Disposables.create() } } @@ -59,16 +59,16 @@ extension VirtualSchedulerTest { times.append(scheduler.clock) let d = scheduler.scheduleRelative((), dueTime: 20.0) { _ in times.append(scheduler.clock) - return NopDisposable.instance + return Disposables.create() } let d2 = scheduler.schedule(()) { _ in times.append(scheduler.clock) - return NopDisposable.instance + return Disposables.create() } d2.dispose() d.dispose() - return NopDisposable.instance + return Disposables.create() } scheduler.start() @@ -87,11 +87,11 @@ extension VirtualSchedulerTest { times.append(scheduler.clock) _ = scheduler.scheduleRelative((), dueTime: 20.0) { _ in times.append(scheduler.clock) - return NopDisposable.instance + return Disposables.create() } return scheduler.schedule(()) { _ in times.append(scheduler.clock) - return NopDisposable.instance + return Disposables.create() } } @@ -113,11 +113,11 @@ extension VirtualSchedulerTest { times.append(scheduler!.clock) _ = scheduler!.scheduleRelative((), dueTime: 20.0) { _ in times.append(scheduler!.clock) - return NopDisposable.instance + return Disposables.create() } return scheduler!.schedule(()) { _ in times.append(scheduler!.clock) - return NopDisposable.instance + return Disposables.create() } } @@ -138,16 +138,16 @@ extension VirtualSchedulerTest { times.append(scheduler!.clock) let d1 = scheduler!.scheduleRelative((), dueTime: 20.0) { _ in times.append(scheduler!.clock) - return NopDisposable.instance + return Disposables.create() } let d2 = scheduler!.schedule(()) { _ in times.append(scheduler!.clock) - return NopDisposable.instance + return Disposables.create() } d1.dispose() d2.dispose() - return NopDisposable.instance + return Disposables.create() } scheduler.advanceTo(20) @@ -166,16 +166,16 @@ extension VirtualSchedulerTest { times.append(scheduler!.clock) _ = scheduler!.scheduleRelative((), dueTime: 20.0) { _ in times.append(scheduler!.clock) - return NopDisposable.instance + return Disposables.create() } _ = scheduler!.schedule(()) { _ in times.append(scheduler!.clock) - return NopDisposable.instance + return Disposables.create() } scheduler!.stop() - return NopDisposable.instance + return Disposables.create() } scheduler.start() @@ -195,14 +195,14 @@ extension VirtualSchedulerTest { scheduler!.sleep(10) _ = scheduler!.scheduleRelative((), dueTime: 20.0) { _ in times.append(scheduler!.clock) - return NopDisposable.instance + return Disposables.create() } _ = scheduler!.schedule(()) { _ in times.append(scheduler!.clock) - return NopDisposable.instance + return Disposables.create() } - return NopDisposable.instance + return Disposables.create() } scheduler.start() @@ -224,7 +224,7 @@ extension VirtualSchedulerTest { times.append(random) _ = scheduler.scheduleRelative((), dueTime: RxTimeInterval(10 * random)) { [weak scheduler] _ in ticks.append(scheduler!.clock) - return NopDisposable.instance + return Disposables.create() } } From 64526c8dcdc9556049fafde979a0930e248c97a7 Mon Sep 17 00:00:00 2001 From: Mo Ramezanpoor Date: Wed, 10 Aug 2016 14:49:21 +0100 Subject: [PATCH 14/18] Replaces all calls to `StableCompositeDisposable.create()` with `Disposables.create()`. --- RxExample/RxExample/Operators.swift | 4 ++-- RxSwift/Observables/Implementations/AddRef.swift | 2 +- RxSwift/Observables/Implementations/Amb.swift | 2 +- RxSwift/Observables/Implementations/Buffer.swift | 2 +- RxSwift/Observables/Implementations/RetryWhen.swift | 2 +- RxSwift/Observables/Implementations/Sample.swift | 2 +- RxSwift/Observables/Implementations/SkipUntil.swift | 2 +- RxSwift/Observables/Implementations/Switch.swift | 2 +- RxSwift/Observables/Implementations/TakeUntil.swift | 2 +- RxSwift/Observables/Implementations/Throttle.swift | 2 +- RxSwift/Observables/Implementations/Timeout.swift | 2 +- RxSwift/Observables/Implementations/Using.swift | 4 ++-- RxSwift/Observables/Implementations/WithLatestFrom.swift | 2 +- 13 files changed, 15 insertions(+), 15 deletions(-) diff --git a/RxExample/RxExample/Operators.swift b/RxExample/RxExample/Operators.swift index 59c9e795..1ed6126b 100644 --- a/RxExample/RxExample/Operators.swift +++ b/RxExample/RxExample/Operators.swift @@ -69,7 +69,7 @@ func <-> (textInput: RxTextInput, variable: Variable) -> Disposable { bindToUIDisposable.dispose() }) - return StableCompositeDisposable.create(bindToUIDisposable, bindToVariable) + return Disposables.create(bindToUIDisposable, bindToVariable) } func <-> (property: ControlProperty, variable: Variable) -> Disposable { @@ -92,7 +92,7 @@ func <-> (property: ControlProperty, variable: Variable) -> Disposable bindToUIDisposable.dispose() }) - return StableCompositeDisposable.create(bindToUIDisposable, bindToVariable) + return Disposables.create(bindToUIDisposable, bindToVariable) } // } diff --git a/RxSwift/Observables/Implementations/AddRef.swift b/RxSwift/Observables/Implementations/AddRef.swift index 25671285..44b7f079 100644 --- a/RxSwift/Observables/Implementations/AddRef.swift +++ b/RxSwift/Observables/Implementations/AddRef.swift @@ -40,7 +40,7 @@ class AddRef : Producer { override func run(_ observer: O) -> Disposable { let releaseDisposable = _refCount.retain() let sink = AddRefSink(observer: observer) - sink.disposable = StableCompositeDisposable.create(releaseDisposable, _source.subscribeSafe(sink)) + sink.disposable = Disposables.create(releaseDisposable, _source.subscribeSafe(sink)) return sink } diff --git a/RxSwift/Observables/Implementations/Amb.swift b/RxSwift/Observables/Implementations/Amb.swift index 9ea6d8d3..7e85093d 100644 --- a/RxSwift/Observables/Implementations/Amb.swift +++ b/RxSwift/Observables/Implementations/Amb.swift @@ -66,7 +66,7 @@ class AmbSink : Sink { func run() -> Disposable { let subscription1 = SingleAssignmentDisposable() let subscription2 = SingleAssignmentDisposable() - let disposeAll = StableCompositeDisposable.create(subscription1, subscription2) + let disposeAll = Disposables.create(subscription1, subscription2) let forwardEvent = { (o: AmbObserverType, event: Event) -> Void in self.forwardOn(event) diff --git a/RxSwift/Observables/Implementations/Buffer.swift b/RxSwift/Observables/Implementations/Buffer.swift index 5025e81a..7757787d 100644 --- a/RxSwift/Observables/Implementations/Buffer.swift +++ b/RxSwift/Observables/Implementations/Buffer.swift @@ -53,7 +53,7 @@ class BufferTimeCountSink func run() -> Disposable { createTimer(_windowID) - return StableCompositeDisposable.create(_timerD, _parent._source.subscribe(self)) + return Disposables.create(_timerD, _parent._source.subscribe(self)) } func startNewWindowAndSendCurrentOne() { diff --git a/RxSwift/Observables/Implementations/RetryWhen.swift b/RxSwift/Observables/Implementations/RetryWhen.swift index e5fb9f38..5c483e27 100644 --- a/RxSwift/Observables/Implementations/RetryWhen.swift +++ b/RxSwift/Observables/Implementations/RetryWhen.swift @@ -127,7 +127,7 @@ class RetryWhenSequenceSink Disposable { let triggerSubscription = _handler.subscribe(_notifier.asObserver()) let superSubscription = super.run(sources) - return StableCompositeDisposable.create(superSubscription, triggerSubscription) + return Disposables.create(superSubscription, triggerSubscription) } } diff --git a/RxSwift/Observables/Implementations/Sample.swift b/RxSwift/Observables/Implementations/Sample.swift index 4906552d..33f3f407 100644 --- a/RxSwift/Observables/Implementations/Sample.swift +++ b/RxSwift/Observables/Implementations/Sample.swift @@ -88,7 +88,7 @@ class SampleSequenceSink _sourceSubscription.disposable = _parent._source.subscribe(self) let samplerSubscription = _parent._sampler.subscribe(SamplerSink(parent: self)) - return StableCompositeDisposable.create(_sourceSubscription, samplerSubscription) + return Disposables.create(_sourceSubscription, samplerSubscription) } func on(_ event: Event) { diff --git a/RxSwift/Observables/Implementations/SkipUntil.swift b/RxSwift/Observables/Implementations/SkipUntil.swift index ae59b7e9..43122869 100644 --- a/RxSwift/Observables/Implementations/SkipUntil.swift +++ b/RxSwift/Observables/Implementations/SkipUntil.swift @@ -103,7 +103,7 @@ class SkipUntilSink) -> Disposable { let subscription = source.subscribe(self) _subscriptions.disposable = subscription - return StableCompositeDisposable.create(_subscriptions, _innerSubscription) + return Disposables.create(_subscriptions, _innerSubscription) } func on(_ event: Event) { diff --git a/RxSwift/Observables/Implementations/TakeUntil.swift b/RxSwift/Observables/Implementations/TakeUntil.swift index d59fc8f1..dab392d4 100644 --- a/RxSwift/Observables/Implementations/TakeUntil.swift +++ b/RxSwift/Observables/Implementations/TakeUntil.swift @@ -98,7 +98,7 @@ class TakeUntilSink func run() -> Disposable { let subscription = _parent._source.subscribe(self) - return StableCompositeDisposable.create(subscription, cancellable) + return Disposables.create(subscription, cancellable) } func on(_ event: Event) { diff --git a/RxSwift/Observables/Implementations/Timeout.swift b/RxSwift/Observables/Implementations/Timeout.swift index 5c586e36..6244e555 100644 --- a/RxSwift/Observables/Implementations/Timeout.swift +++ b/RxSwift/Observables/Implementations/Timeout.swift @@ -35,7 +35,7 @@ class TimeoutSink: Sink) { diff --git a/RxSwift/Observables/Implementations/Using.swift b/RxSwift/Observables/Implementations/Using.swift index a3d4d176..11c2f254 100644 --- a/RxSwift/Observables/Implementations/Using.swift +++ b/RxSwift/Observables/Implementations/Using.swift @@ -28,12 +28,12 @@ class UsingSink) { From c643d4c0b57613c79c7b64eaeb35da706f12768b Mon Sep 17 00:00:00 2001 From: Mo Ramezanpoor Date: Wed, 10 Aug 2016 15:00:02 +0100 Subject: [PATCH 15/18] Returns `Cancelable` instead of `Disposable` from all overloads of `Disposables.create()` except for no-op (which is stateless). --- RxSwift/Disposables/AnonymousDisposable.swift | 2 +- RxSwift/Disposables/BinaryDisposable.swift | 2 +- RxSwift/Disposables/Disposables.swift | 10 +++------- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/RxSwift/Disposables/AnonymousDisposable.swift b/RxSwift/Disposables/AnonymousDisposable.swift index b25070a8..11accd29 100644 --- a/RxSwift/Disposables/AnonymousDisposable.swift +++ b/RxSwift/Disposables/AnonymousDisposable.swift @@ -62,7 +62,7 @@ public final class AnonymousDisposable : DisposeBase, Cancelable { public extension Disposables { - static func create(with action: () -> ()) -> Disposable { + static func create(with action: () -> ()) -> Cancelable { return AnonymousDisposable(disposeAction: action) } diff --git a/RxSwift/Disposables/BinaryDisposable.swift b/RxSwift/Disposables/BinaryDisposable.swift index aa1f811b..d4a84a2d 100644 --- a/RxSwift/Disposables/BinaryDisposable.swift +++ b/RxSwift/Disposables/BinaryDisposable.swift @@ -55,7 +55,7 @@ private final class BinaryDisposable : DisposeBase, Cancelable { public extension Disposables { - static func create(_ disposable1: Disposable, _ disposable2: Disposable) -> Disposable { + static func create(_ disposable1: Disposable, _ disposable2: Disposable) -> Cancelable { return BinaryDisposable(disposable1, disposable2) } diff --git a/RxSwift/Disposables/Disposables.swift b/RxSwift/Disposables/Disposables.swift index d60cca8e..e70a032b 100644 --- a/RxSwift/Disposables/Disposables.swift +++ b/RxSwift/Disposables/Disposables.swift @@ -20,11 +20,11 @@ public extension Disposables { return noOp } - static func create(_ disposable1: Disposable, _ disposable2: Disposable, _ disposable3: Disposable) -> Disposable { + static func create(_ disposable1: Disposable, _ disposable2: Disposable, _ disposable3: Disposable) -> Cancelable { return CompositeDisposable(disposable1, disposable2, disposable3) } - static func create(_ disposable1: Disposable, _ disposable2: Disposable, _ disposable3: Disposable, _ disposables: Disposable ...) -> Disposable { + static func create(_ disposable1: Disposable, _ disposable2: Disposable, _ disposable3: Disposable, _ disposables: Disposable ...) -> Cancelable { var disposables = disposables disposables.append(disposable1) disposables.append(disposable2) @@ -32,12 +32,8 @@ public extension Disposables { return CompositeDisposable(disposables: disposables) } - static func create(_ disposables: [Disposable]) -> Disposable { + static func create(_ disposables: [Disposable]) -> Cancelable { switch disposables.count { - case 0: - return Disposables.create() - case 1: - return disposables[0] case 2: return Disposables.create(disposables[0], disposables[1]) default: From 75971c61c67f6a242dd755aa196ab1917dc49955 Mon Sep 17 00:00:00 2001 From: Mo Ramezanpoor Date: Wed, 10 Aug 2016 15:00:29 +0100 Subject: [PATCH 16/18] Replaces all calls to `AnonymousDisposable.init()` with `Disposables.create()`. --- Documentation/GettingStarted.md | 6 ++-- RxCocoa/Common/DelegateProxyType.swift | 2 +- .../Implementations/KVOObservable.swift | 2 +- .../Observables/NSNotificationCenter+Rx.swift | 2 +- .../Common/Observables/NSURLSession+Rx.swift | 2 +- RxCocoa/iOS/UIControl+Rx.swift | 4 +-- .../UIImagePickerController+RxCreate.swift | 2 +- .../Services/ActivityIndicator.swift | 2 +- RxExample/RxExample/Services/Wireframe.swift | 2 +- RxSwift/ImmediateSchedulerType.swift | 2 +- RxSwift/ObservableType+Extensions.swift | 4 +-- .../Implementations/RefCount.swift | 2 +- RxSwift/SchedulerType.swift | 2 +- .../Schedulers/CurrentThreadScheduler.swift | 2 +- .../Internal/DispatchQueueConfiguration.swift | 4 +-- .../Schedulers/OperationQueueScheduler.swift | 2 +- RxTests/ColdObservable.swift | 2 +- RxTests/HotObservable.swift | 2 +- Tests/RxCocoaTests/SentMessageTest.swift | 2 +- .../TestImplementations/Mocks/MySubject.swift | 2 +- .../Mocks/PrimitiveHotObservable.swift | 2 +- Tests/RxSwiftTests/Tests/BagTest.swift | 12 +++---- Tests/RxSwiftTests/Tests/DisposableTest.swift | 32 +++++++++---------- .../Tests/Observable+BindingTest.swift | 2 +- .../Tests/Observable+ConcurrencyTest.swift | 2 +- .../Tests/Observable+MultipleTest.swift | 2 +- 26 files changed, 51 insertions(+), 51 deletions(-) diff --git a/Documentation/GettingStarted.md b/Documentation/GettingStarted.md index 1f1380f0..e41f562c 100644 --- a/Documentation/GettingStarted.md +++ b/Documentation/GettingStarted.md @@ -382,7 +382,7 @@ func myInterval(interval: NSTimeInterval) -> Observable { var next = 0 dispatch_source_set_timer(timer, 0, UInt64(interval * Double(NSEC_PER_SEC)), 0) - let cancel = AnonymousDisposable { + let cancel = Disposables.create { print("Disposed") dispatch_source_cancel(timer) } @@ -574,7 +574,7 @@ extension NSURLSession { task.resume() - return AnonymousDisposable { + return Disposables.create { task.cancel() } } @@ -831,7 +831,7 @@ extension ObservableType { observer.on(.Completed) } } - return AnonymousDisposable { + return Disposables.create { print("disposing \(identifier)") subscription.dispose() } diff --git a/RxCocoa/Common/DelegateProxyType.swift b/RxCocoa/Common/DelegateProxyType.swift index a669dfbc..2596e398 100644 --- a/RxCocoa/Common/DelegateProxyType.swift +++ b/RxCocoa/Common/DelegateProxyType.swift @@ -228,7 +228,7 @@ extension DelegateProxyType { assert(proxy.forwardToDelegate() === forwardDelegate, "Setting of delegate failed") - return AnonymousDisposable { + return Disposables.create { MainScheduler.ensureExecutingOnScheduler() let delegate: AnyObject? = weakForwardDelegate diff --git a/RxCocoa/Common/Observables/Implementations/KVOObservable.swift b/RxCocoa/Common/Observables/Implementations/KVOObservable.swift index 55a24c54..16d55bb9 100644 --- a/RxCocoa/Common/Observables/Implementations/KVOObservable.swift +++ b/RxCocoa/Common/Observables/Implementations/KVOObservable.swift @@ -42,7 +42,7 @@ class KVOObservable observer.on(.next(value as? Element)) } - return AnonymousDisposable(observer.dispose) + return Disposables.create(with: observer.dispose) } } diff --git a/RxCocoa/Common/Observables/NSNotificationCenter+Rx.swift b/RxCocoa/Common/Observables/NSNotificationCenter+Rx.swift index 8a87cfe4..d89dfb97 100644 --- a/RxCocoa/Common/Observables/NSNotificationCenter+Rx.swift +++ b/RxCocoa/Common/Observables/NSNotificationCenter+Rx.swift @@ -26,7 +26,7 @@ extension NotificationCenter { observer.on(.next(notification)) } - return AnonymousDisposable { + return Disposables.create { self.removeObserver(nsObserver) } } diff --git a/RxCocoa/Common/Observables/NSURLSession+Rx.swift b/RxCocoa/Common/Observables/NSURLSession+Rx.swift index 0e183bda..35eb6f2a 100644 --- a/RxCocoa/Common/Observables/NSURLSession+Rx.swift +++ b/RxCocoa/Common/Observables/NSURLSession+Rx.swift @@ -155,7 +155,7 @@ extension URLSession { let t = task t.resume() - return AnonymousDisposable(task.cancel) + return Disposables.create(with: task.cancel) } } diff --git a/RxCocoa/iOS/UIControl+Rx.swift b/RxCocoa/iOS/UIControl+Rx.swift index 6f98323f..8c421bb1 100644 --- a/RxCocoa/iOS/UIControl+Rx.swift +++ b/RxCocoa/iOS/UIControl+Rx.swift @@ -53,7 +53,7 @@ extension UIControl { observer.on(.next()) } - return AnonymousDisposable(controlTarget.dispose) + return Disposables.create(with: controlTarget.dispose) }.takeUntil(rx_deallocated) return ControlEvent(events: source) @@ -78,7 +78,7 @@ extension UIControl { } } - return AnonymousDisposable(controlTarget.dispose) + return Disposables.create(with: controlTarget.dispose) } .takeUntil((control as! NSObject).rx_deallocated) diff --git a/RxExample/RxExample/Examples/ImagePicker/UIImagePickerController+RxCreate.swift b/RxExample/RxExample/Examples/ImagePicker/UIImagePickerController+RxCreate.swift index 134d71b2..35342a15 100644 --- a/RxExample/RxExample/Examples/ImagePicker/UIImagePickerController+RxCreate.swift +++ b/RxExample/RxExample/Examples/ImagePicker/UIImagePickerController+RxCreate.swift @@ -56,7 +56,7 @@ extension UIImagePickerController { parent.present(imagePicker, animated: animated, completion: nil) observer.on(.next(imagePicker)) - return Disposables.create(dismissDisposable, AnonymousDisposable { + return Disposables.create(dismissDisposable, Disposables.create { dismissViewController(imagePicker, animated: animated) }) } diff --git a/RxExample/RxExample/Services/ActivityIndicator.swift b/RxExample/RxExample/Services/ActivityIndicator.swift index 5ea8062b..b74d1ce6 100644 --- a/RxExample/RxExample/Services/ActivityIndicator.swift +++ b/RxExample/RxExample/Services/ActivityIndicator.swift @@ -18,7 +18,7 @@ private struct ActivityToken : ObservableConvertibleType, Disposable { init(source: Observable, disposeAction: () -> ()) { _source = source - _dispose = AnonymousDisposable(disposeAction) + _dispose = Disposables.create(with: disposeAction) } func dispose() { diff --git a/RxExample/RxExample/Services/Wireframe.swift b/RxExample/RxExample/Services/Wireframe.swift index bb36e5fe..85fb4f76 100644 --- a/RxExample/RxExample/Services/Wireframe.swift +++ b/RxExample/RxExample/Services/Wireframe.swift @@ -71,7 +71,7 @@ class DefaultWireframe: Wireframe { DefaultWireframe.rootViewController().present(alertView, animated: true, completion: nil) - return AnonymousDisposable { + return Disposables.create { alertView.dismiss(animated:false, completion: nil) } } diff --git a/RxSwift/ImmediateSchedulerType.swift b/RxSwift/ImmediateSchedulerType.swift index 536c6d45..a12e241d 100644 --- a/RxSwift/ImmediateSchedulerType.swift +++ b/RxSwift/ImmediateSchedulerType.swift @@ -35,6 +35,6 @@ extension ImmediateSchedulerType { recursiveScheduler.schedule(state) - return AnonymousDisposable(recursiveScheduler.dispose) + return Disposables.create(with: recursiveScheduler.dispose) } } diff --git a/RxSwift/ObservableType+Extensions.swift b/RxSwift/ObservableType+Extensions.swift index 18b72e00..87f6a3f5 100644 --- a/RxSwift/ObservableType+Extensions.swift +++ b/RxSwift/ObservableType+Extensions.swift @@ -42,7 +42,7 @@ extension ObservableType { let disposable: Disposable if let disposed = onDisposed { - disposable = AnonymousDisposable(disposed) + disposable = Disposables.create(with: disposed) } else { disposable = Disposables.create() @@ -88,7 +88,7 @@ extension ObservableType { let disposable: Disposable if let disposed = onDisposed { - disposable = AnonymousDisposable(disposed) + disposable = Disposables.create(with: disposed) } else { disposable = Disposables.create() diff --git a/RxSwift/Observables/Implementations/RefCount.swift b/RxSwift/Observables/Implementations/RefCount.swift index d482f488..7ba86272 100644 --- a/RxSwift/Observables/Implementations/RefCount.swift +++ b/RxSwift/Observables/Implementations/RefCount.swift @@ -34,7 +34,7 @@ class RefCountSink }) } - return AnonymousDisposable { + return Disposables.create { let existing = self.subscriptions[i] self.subscriptions[i] = Subscription(existing.subscribe, self.testScheduler.clock) } diff --git a/RxTests/HotObservable.swift b/RxTests/HotObservable.swift index 036bde2d..d5f42eeb 100644 --- a/RxTests/HotObservable.swift +++ b/RxTests/HotObservable.swift @@ -46,7 +46,7 @@ class HotObservable let i = self.subscriptions.count - 1 - return AnonymousDisposable { + return Disposables.create { let removed = self._observers.removeKey(key) assert(removed != nil) diff --git a/Tests/RxCocoaTests/SentMessageTest.swift b/Tests/RxCocoaTests/SentMessageTest.swift index 39575eba..6b20eae4 100644 --- a/Tests/RxCocoaTests/SentMessageTest.swift +++ b/Tests/RxCocoaTests/SentMessageTest.swift @@ -1063,7 +1063,7 @@ extension SentMessageTest { let t = T.createInstance() //let disposable = (t as! NSObject).rx_observe(NSArray.self, "messages").publish().connect() (t as! NSObject).addObserver(self, forKeyPath: "messages", options: [], context: nil) - return (t, [AnonymousDisposable { (t as! NSObject).removeObserver(self, forKeyPath: "messages") }]) + return (t, [Disposables.create { (t as! NSObject).removeObserver(self, forKeyPath: "messages") }]) } } diff --git a/Tests/RxSwiftTests/TestImplementations/Mocks/MySubject.swift b/Tests/RxSwiftTests/TestImplementations/Mocks/MySubject.swift index 9115e157..343f9f5f 100644 --- a/Tests/RxSwiftTests/TestImplementations/Mocks/MySubject.swift +++ b/Tests/RxSwiftTests/TestImplementations/Mocks/MySubject.swift @@ -45,7 +45,7 @@ class MySubject : SubjectType, ObserverType { _subscribeCount += 1 _observer = AnyObserver(observer) - return AnonymousDisposable { + return Disposables.create { self._observer = AnyObserver { _ -> Void in () } self._disposed = true } diff --git a/Tests/RxSwiftTests/TestImplementations/Mocks/PrimitiveHotObservable.swift b/Tests/RxSwiftTests/TestImplementations/Mocks/PrimitiveHotObservable.swift index af5f47db..e5b57c96 100644 --- a/Tests/RxSwiftTests/TestImplementations/Mocks/PrimitiveHotObservable.swift +++ b/Tests/RxSwiftTests/TestImplementations/Mocks/PrimitiveHotObservable.swift @@ -44,7 +44,7 @@ class PrimitiveHotObservable : ObservableType { let i = self.subscriptions.count - 1 - return AnonymousDisposable { + return Disposables.create { self.lock.lock() defer { self.lock.unlock() } diff --git a/Tests/RxSwiftTests/Tests/BagTest.swift b/Tests/RxSwiftTests/Tests/BagTest.swift index a4a16b48..f36c22e5 100644 --- a/Tests/RxSwiftTests/Tests/BagTest.swift +++ b/Tests/RxSwiftTests/Tests/BagTest.swift @@ -56,7 +56,7 @@ extension BagTest { ) numberOfActionsAfter(i, deletionsFromStart: j, - createNew: { () -> Disposable in AnonymousDisposable { numberDisposables += 1 } }, + createNew: { () -> Disposable in Disposables.create { numberDisposables += 1 } }, bagAction: { (bag: RxMutableBox>) in disposeAll(in: bag.value); XCTAssertTrue(bag.value.count == i - j) } ) @@ -103,7 +103,7 @@ extension BagTest { ) numberOfActionsAfter(i, deletionsFromStart: j, - createNew: { () -> Disposable in AnonymousDisposable { numberDisposables += 1 } }, + createNew: { () -> Disposable in Disposables.create { numberDisposables += 1 } }, bagAction: { (bag: RxMutableBox>) in disposeAll(in: bag.value); XCTAssertTrue(bag.value.count == i - j) } ) @@ -137,7 +137,7 @@ extension BagTest { } increment2 += 1 }) - _ = bag3.value.insert(AnonymousDisposable { _ in + _ = bag3.value.insert(Disposables.create { _ in if increment3 == breakAt { bag3.value.removeAll() } @@ -176,7 +176,7 @@ extension BagTest { ) numberOfActionsAfter(100, deletionsFromStart: 0, - createNew: { () -> Disposable in AnonymousDisposable { numberDisposables += 1 } }, + createNew: { () -> Disposable in Disposables.create { numberDisposables += 1 } }, bagAction: { (bag: RxMutableBox>) in bag.value.removeAll(); disposeAll(in: bag.value); } ) @@ -194,7 +194,7 @@ extension BagTest { var keys: [Bag.KeyType] = [] for _ in 0...KeyType] = [] for _ in 0.. = Observable.deferred { count += 1 return Observable.create { obs in - return AnonymousDisposable { + return Disposables.create { disconnected = true } } diff --git a/Tests/RxSwiftTests/Tests/Observable+ConcurrencyTest.swift b/Tests/RxSwiftTests/Tests/Observable+ConcurrencyTest.swift index ca1f6ce5..95cb80df 100644 --- a/Tests/RxSwiftTests/Tests/Observable+ConcurrencyTest.swift +++ b/Tests/RxSwiftTests/Tests/Observable+ConcurrencyTest.swift @@ -579,7 +579,7 @@ extension ObservableConcurrencyTest { let xs: Observable = Observable.create { observer in scheduled = scheduler.clock - return AnonymousDisposable { + return Disposables.create { disposed = scheduler.clock } } diff --git a/Tests/RxSwiftTests/Tests/Observable+MultipleTest.swift b/Tests/RxSwiftTests/Tests/Observable+MultipleTest.swift index fa92d951..fcc979bd 100644 --- a/Tests/RxSwiftTests/Tests/Observable+MultipleTest.swift +++ b/Tests/RxSwiftTests/Tests/Observable+MultipleTest.swift @@ -4263,7 +4263,7 @@ extension ObservableMultipleTest { ]) let r: Observable = Observable.create { o in - return AnonymousDisposable { + return Disposables.create { disposed = true } } From 8754166f3521a9459d6537d5afd7e749b2c5b371 Mon Sep 17 00:00:00 2001 From: Mo Ramezanpoor Date: Wed, 10 Aug 2016 15:03:52 +0100 Subject: [PATCH 17/18] Hides `Disposables.init()` internally by making it private. --- RxSwift/Disposables/Disposables.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/RxSwift/Disposables/Disposables.swift b/RxSwift/Disposables/Disposables.swift index e70a032b..ac6ee125 100644 --- a/RxSwift/Disposables/Disposables.swift +++ b/RxSwift/Disposables/Disposables.swift @@ -10,6 +10,8 @@ import Foundation public struct Disposables { + private init() {} + } public extension Disposables { From f8a11aa0cb7799d9b7f9be9b2702c704a372d061 Mon Sep 17 00:00:00 2001 From: Mo Ramezanpoor Date: Wed, 10 Aug 2016 15:14:26 +0100 Subject: [PATCH 18/18] Document `Disposables`. --- RxSwift/Disposables/AnonymousDisposable.swift | 9 +++++++-- RxSwift/Disposables/BinaryDisposable.swift | 3 +++ RxSwift/Disposables/Disposables.swift | 15 +++++++++++++++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/RxSwift/Disposables/AnonymousDisposable.swift b/RxSwift/Disposables/AnonymousDisposable.swift index 11accd29..dd5b1bb5 100644 --- a/RxSwift/Disposables/AnonymousDisposable.swift +++ b/RxSwift/Disposables/AnonymousDisposable.swift @@ -62,8 +62,13 @@ public final class AnonymousDisposable : DisposeBase, Cancelable { public extension Disposables { - static func create(with action: () -> ()) -> Cancelable { - return AnonymousDisposable(disposeAction: action) + /** + Constructs a new disposable with the given action used for disposal. + + - parameter dispose: Disposal action which will be run upon calling `dispose`. + */ + static func create(with dispose: () -> ()) -> Cancelable { + return AnonymousDisposable(disposeAction: dispose) } } diff --git a/RxSwift/Disposables/BinaryDisposable.swift b/RxSwift/Disposables/BinaryDisposable.swift index d4a84a2d..583b176b 100644 --- a/RxSwift/Disposables/BinaryDisposable.swift +++ b/RxSwift/Disposables/BinaryDisposable.swift @@ -55,6 +55,9 @@ private final class BinaryDisposable : DisposeBase, Cancelable { public extension Disposables { + /** + Creates a disposable with the given disposables. + */ static func create(_ disposable1: Disposable, _ disposable2: Disposable) -> Cancelable { return BinaryDisposable(disposable1, disposable2) } diff --git a/RxSwift/Disposables/Disposables.swift b/RxSwift/Disposables/Disposables.swift index ac6ee125..694b1e5f 100644 --- a/RxSwift/Disposables/Disposables.swift +++ b/RxSwift/Disposables/Disposables.swift @@ -8,6 +8,9 @@ import Foundation +/** + A collection of utility methods for common disposable operations. + */ public struct Disposables { private init() {} @@ -18,14 +21,23 @@ public extension Disposables { private static let noOp: Disposable = NopDisposable() + /** + Creates a disposable that does nothing on disposal. + */ static func create() -> Disposable { return noOp } + /** + Creates a disposable with the given disposables. + */ static func create(_ disposable1: Disposable, _ disposable2: Disposable, _ disposable3: Disposable) -> Cancelable { return CompositeDisposable(disposable1, disposable2, disposable3) } + /** + Creates a disposable with the given disposables. + */ static func create(_ disposable1: Disposable, _ disposable2: Disposable, _ disposable3: Disposable, _ disposables: Disposable ...) -> Cancelable { var disposables = disposables disposables.append(disposable1) @@ -34,6 +46,9 @@ public extension Disposables { return CompositeDisposable(disposables: disposables) } + /** + Creates a disposable with the given disposables. + */ static func create(_ disposables: [Disposable]) -> Cancelable { switch disposables.count { case 2: