diff --git a/RxCocoa/Common/CocoaUnits/Driver/Driver+Operators.swift b/RxCocoa/Common/CocoaUnits/Driver/Driver+Operators.swift index 6063cb28..ea428d94 100644 --- a/RxCocoa/Common/CocoaUnits/Driver/Driver+Operators.swift +++ b/RxCocoa/Common/CocoaUnits/Driver/Driver+Operators.swift @@ -123,7 +123,7 @@ extension DriverConvertibleType { public func doOn(_ eventHandler: (Event) -> Void) -> Driver { let source = self.asObservable() - .doOn(eventHandler: eventHandler) + .doOn(eventHandler) return Driver(source) } @@ -137,7 +137,7 @@ extension DriverConvertibleType { - returns: The source sequence with the side-effecting behavior applied. */ // @warn_unused_result(message:"http://git.io/rxs.uo") - public func doOn(_ onNext: ((E) -> Void)? = nil, onError: ((ErrorProtocol) -> Void)? = nil, onCompleted: (() -> Void)? = nil) + public func doOn(onNext: ((E) -> Void)? = nil, onError: ((ErrorProtocol) -> Void)? = nil, onCompleted: (() -> Void)? = nil) -> Driver { let source = self.asObservable() .doOn(onNext: onNext, onError: onError, onCompleted: onCompleted) @@ -152,9 +152,9 @@ extension DriverConvertibleType { - returns: The source sequence with the side-effecting behavior applied. */ // @warn_unused_result(message:"http://git.io/rxs.uo") - public func doOnNext(_ onNext: ((E) -> Void)) + public func `do`(onNext: ((E) -> Void)) -> Driver { - return self.doOn(onNext) + return self.doOn(onNext: onNext) } /** @@ -164,7 +164,7 @@ extension DriverConvertibleType { - returns: The source sequence with the side-effecting behavior applied. */ // @warn_unused_result(message:"http://git.io/rxs.uo") - public func doOnCompleted(_ onCompleted: (() -> Void)) + public func `do`(onCompleted: (() -> Void)) -> Driver { return self.doOn(onCompleted: onCompleted) } @@ -399,7 +399,7 @@ extension Collection where Iterator.Element : DriverConvertibleType { */ // @warn_unused_result(message:"http://git.io/rxs.uo") public func zip(_ resultSelector: ([Generator.Element.E]) throws -> R) -> Driver { - let source = self.map { $0.asDriver().asObservable() }.zip(resultSelector: resultSelector) + let source = self.map { $0.asDriver().asObservable() }.zip(resultSelector) return Driver(source) } } @@ -415,7 +415,7 @@ extension Collection where Iterator.Element : DriverConvertibleType { */ // @warn_unused_result(message:"http://git.io/rxs.uo") public func combineLatest(_ resultSelector: ([Generator.Element.E]) throws -> R) -> Driver { - let source = self.map { $0.asDriver().asObservable() }.combineLatest(resultSelector: resultSelector) + let source = self.map { $0.asDriver().asObservable() }.combineLatest(resultSelector) return Driver(source) } } diff --git a/RxExample/RxExample/Services/ImageService.swift b/RxExample/RxExample/Services/ImageService.swift index 1f3a7eb9..82ca0057 100644 --- a/RxExample/RxExample/Services/ImageService.swift +++ b/RxExample/RxExample/Services/ImageService.swift @@ -75,17 +75,17 @@ class DefaultImageService: ImageService { else { // fetch from network decodedImage = self.$.URLSession.rx_data(URLRequest(url: url)) - .doOnNext { data in + .do(onNext: { data in self._imageDataCache.setObject(data, forKey: url) - } + }) .flatMap(self.decodeImage) .trackActivity(self.loadingImage) } } - return decodedImage.doOnNext { image in + return decodedImage.do(onNext: { image in self._imageCache.setObject(image, forKey: url) - } + }) } } diff --git a/RxSwift/DataStructures/Bag.swift b/RxSwift/DataStructures/Bag.swift index 82f84bed..6b7192f3 100644 --- a/RxSwift/DataStructures/Bag.swift +++ b/RxSwift/DataStructures/Bag.swift @@ -297,7 +297,15 @@ extension Bag where T: ObserverType { /** Dispatches `dispose` to all disposables contained inside bag. */ +@available(*, deprecated, renamed: "disposeAll(in:)") public func disposeAllIn(_ bag: Bag) { + disposeAll(in: bag) +} + +/** + Dispatches `dispose` to all disposables contained inside bag. + */ +public func disposeAll(in bag: Bag) { if bag._onlyFastPath { bag._value0?.dispose() return diff --git a/RxSwift/Disposables/CompositeDisposable.swift b/RxSwift/Disposables/CompositeDisposable.swift index 10bdd313..a60c2730 100644 --- a/RxSwift/Disposables/CompositeDisposable.swift +++ b/RxSwift/Disposables/CompositeDisposable.swift @@ -77,17 +77,29 @@ public class CompositeDisposable : DisposeBase, Disposable, Cancelable { - returns: Key that can be used to remove disposable from composite disposable. In case dispose bag was already disposed `nil` will be returned. */ + @available(*, deprecated, renamed: "insert(_:)") public func addDisposable(_ disposable: Disposable) -> DisposeKey? { - let key = _addDisposable(disposable) - + return insert(disposable) + } + + /** + Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed. + + - parameter disposable: Disposable to add. + - returns: Key that can be used to remove disposable from composite disposable. In case dispose bag was already + disposed `nil` will be returned. + */ + public func insert(_ disposable: Disposable) -> DisposeKey? { + let key = _insert(disposable) + if key == nil { disposable.dispose() } return key } - - private func _addDisposable(_ disposable: Disposable) -> DisposeKey? { + + private func _insert(_ disposable: Disposable) -> DisposeKey? { _lock.lock(); defer { _lock.unlock() } return _disposables?.insert(disposable) @@ -102,15 +114,25 @@ public class CompositeDisposable : DisposeBase, Disposable, Cancelable { } /** - Removes and disposes the disposable identified by `disposeKey` from the CompositeDisposable. - - - parameter disposeKey: Key used to identify disposable to be removed. - */ + Removes and disposes the disposable identified by `disposeKey` from the CompositeDisposable. + + - parameter disposeKey: Key used to identify disposable to be removed. + */ + @available(*, deprecated, renamed: "remove(for:)") public func removeDisposable(_ disposeKey: DisposeKey) { - _removeDisposable(disposeKey)?.dispose() + remove(for: disposeKey) } - - private func _removeDisposable(_ disposeKey: DisposeKey) -> Disposable? { + + /** + Removes and disposes the disposable identified by `disposeKey` from the CompositeDisposable. + + - parameter disposeKey: Key used to identify disposable to be removed. + */ + public func remove(for disposeKey: DisposeKey) { + _remove(for: disposeKey)?.dispose() + } + + private func _remove(for disposeKey: DisposeKey) -> Disposable? { _lock.lock(); defer { _lock.unlock() } return _disposables?.removeKey(disposeKey) } @@ -120,7 +142,7 @@ public class CompositeDisposable : DisposeBase, Disposable, Cancelable { */ public func dispose() { if let disposables = _dispose() { - disposeAllIn(disposables) + disposeAll(in: disposables) } } diff --git a/RxSwift/Disposables/DisposeBag.swift b/RxSwift/Disposables/DisposeBag.swift index 3d9ed244..c466515d 100644 --- a/RxSwift/Disposables/DisposeBag.swift +++ b/RxSwift/Disposables/DisposeBag.swift @@ -15,7 +15,7 @@ extension Disposable { - parameter bag: `DisposeBag` to add `self` to. */ public func addDisposableTo(_ bag: DisposeBag) { - bag.addDisposable(self) + bag.insert(self) } } @@ -51,11 +51,21 @@ public class DisposeBag: DisposeBase { - parameter disposable: Disposable to add. */ + @available(*, deprecated, renamed: "insert(_:)") public func addDisposable(_ disposable: Disposable) { - _addDisposable(disposable)?.dispose() + insert(disposable) } - - private func _addDisposable(_ disposable: Disposable) -> Disposable? { + + /** + Adds `disposable` to be disposed when dispose bag is being deinited. + + - parameter disposable: Disposable to add. + */ + public func insert(_ disposable: Disposable) { + _insert(disposable)?.dispose() + } + + private func _insert(_ disposable: Disposable) -> Disposable? { _lock.lock(); defer { _lock.unlock() } if _disposed { return disposable diff --git a/RxSwift/Observables/Implementations/Merge.swift b/RxSwift/Observables/Implementations/Merge.swift index 7647087a..617a29af 100644 --- a/RxSwift/Observables/Implementations/Merge.swift +++ b/RxSwift/Observables/Implementations/Merge.swift @@ -42,7 +42,7 @@ class MergeLimitedSinkIter) -> Disposable { - let _ = _group.addDisposable(_sourceSubscription) + let _ = _group.insert(_sourceSubscription) let disposable = source.subscribe(self) _sourceSubscription.disposable = disposable @@ -96,7 +96,7 @@ class MergeLimitedSink) { let iterDisposable = SingleAssignmentDisposable() - if let disposeKey = _group.addDisposable(iterDisposable) { + if let disposeKey = _group.insert(iterDisposable) { let iter = MergeSinkIter(parent: self, disposeKey: disposeKey) let subscription = source.subscribe(iter) iterDisposable.disposable = subscription @@ -339,7 +339,7 @@ class MergeSink) -> Disposable { - let _ = _group.addDisposable(_sourceSubscription) + let _ = _group.insert(_sourceSubscription) let subscription = source.subscribe(self) _sourceSubscription.disposable = subscription diff --git a/RxSwift/Observables/Implementations/Window.swift b/RxSwift/Observables/Implementations/Window.swift index 71489391..637bfff3 100644 --- a/RxSwift/Observables/Implementations/Window.swift +++ b/RxSwift/Observables/Implementations/Window.swift @@ -31,7 +31,7 @@ class WindowTimeCountSink(resultSelector: ([Generator.Element.E]) throws -> R) -> Observable { + public func combineLatest(_ resultSelector: ([Generator.Element.E]) throws -> R) -> Observable { return CombineLatestCollectionType(sources: self, resultSelector: resultSelector) } } @@ -39,7 +39,7 @@ extension Collection where Iterator.Element : ObservableType { - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. */ // @warn_unused_result(message:"http://git.io/rxs.uo") - public func zip(resultSelector: ([Generator.Element.E]) throws -> R) -> Observable { + public func zip(_ resultSelector: ([Generator.Element.E]) throws -> R) -> Observable { return ZipCollectionType(sources: self, resultSelector: resultSelector) } } diff --git a/RxSwift/Observables/Observable+Single.swift b/RxSwift/Observables/Observable+Single.swift index 784fd4a0..4ed98d6a 100644 --- a/RxSwift/Observables/Observable+Single.swift +++ b/RxSwift/Observables/Observable+Single.swift @@ -84,7 +84,7 @@ extension ObservableType { - returns: The source sequence with the side-effecting behavior applied. */ // @warn_unused_result(message:"http://git.io/rxs.uo") - public func doOn(eventHandler: (Event) throws -> Void) + public func doOn(_ eventHandler: (Event) throws -> Void) -> Observable { return Do(source: self.asObservable(), eventHandler: eventHandler) } @@ -121,7 +121,7 @@ extension ObservableType { - returns: The source sequence with the side-effecting behavior applied. */ // @warn_unused_result(message:"http://git.io/rxs.uo") - public func doOnNext(onNext: ((E) throws -> Void)) + public func `do`(onNext: ((E) throws -> Void)) -> Observable { return self.doOn(onNext: onNext) } @@ -133,7 +133,7 @@ extension ObservableType { - returns: The source sequence with the side-effecting behavior applied. */ // @warn_unused_result(message:"http://git.io/rxs.uo") - public func doOnError(onError: ((ErrorProtocol) throws -> Void)) + public func `do`(onError: ((ErrorProtocol) throws -> Void)) -> Observable { return self.doOn(onError: onError) } @@ -145,7 +145,7 @@ extension ObservableType { - returns: The source sequence with the side-effecting behavior applied. */ // @warn_unused_result(message:"http://git.io/rxs.uo") - public func doOnCompleted(onCompleted: (() throws -> Void)) + public func `do`(onCompleted: (() throws -> Void)) -> Observable { return self.doOn(onCompleted: onCompleted) } @@ -229,7 +229,7 @@ extension ObservableType { - returns: An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully or is notified to error or complete. */ // @warn_unused_result(message:"http://git.io/rxs.uo") - public func retryWhen(notificationHandler: (Observable) -> TriggerObservable) + public func retryWhen(_ notificationHandler: (Observable) -> TriggerObservable) -> Observable { return RetryWhenSequence(sources: InfiniteSequence(repeatedValue: self.asObservable()), notificationHandler: notificationHandler) } diff --git a/RxSwift/Schedulers/Internal/DispatchQueueConfiguration.swift b/RxSwift/Schedulers/Internal/DispatchQueueConfiguration.swift index f35208da..120a96ee 100644 --- a/RxSwift/Schedulers/Internal/DispatchQueueConfiguration.swift +++ b/RxSwift/Schedulers/Internal/DispatchQueueConfiguration.swift @@ -60,12 +60,12 @@ extension DispatchQueueConfiguration { if compositeDisposable.disposed { return } - _ = compositeDisposable.addDisposable(action(state)) + _ = compositeDisposable.insert(action(state)) cancelTimer.dispose() }) timer.resume() - _ = compositeDisposable.addDisposable(cancelTimer) + _ = compositeDisposable.insert(cancelTimer) return compositeDisposable } diff --git a/RxSwift/Schedulers/OperationQueueScheduler.swift b/RxSwift/Schedulers/OperationQueueScheduler.swift index 904e349e..24292aff 100644 --- a/RxSwift/Schedulers/OperationQueueScheduler.swift +++ b/RxSwift/Schedulers/OperationQueueScheduler.swift @@ -44,12 +44,12 @@ public class OperationQueueScheduler: ImmediateSchedulerType { } let disposable = action(state) - let _ = compositeDisposableWeak?.addDisposable(disposable) + let _ = compositeDisposableWeak?.insert(disposable) } self.operationQueue.addOperation(operation) - let _ = compositeDisposable.addDisposable(AnonymousDisposable(operation.cancel)) + let _ = compositeDisposable.insert(AnonymousDisposable(operation.cancel)) return compositeDisposable } diff --git a/RxSwift/Schedulers/RecursiveScheduler.swift b/RxSwift/Schedulers/RecursiveScheduler.swift index 527b35a6..473b43c1 100644 --- a/RxSwift/Schedulers/RecursiveScheduler.swift +++ b/RxSwift/Schedulers/RecursiveScheduler.swift @@ -47,7 +47,7 @@ class AnyRecursiveScheduler { let action = self._lock.calculateLocked { () -> Action? in if isAdded { - self._group.removeDisposable(removeKey!) + self._group.remove(for: removeKey!) } else { isDone = true @@ -65,7 +65,7 @@ class AnyRecursiveScheduler { _lock.performLocked { if !isDone { - removeKey = _group.addDisposable(d) + removeKey = _group.insert(d) isAdded = true } } @@ -90,7 +90,7 @@ class AnyRecursiveScheduler { let action = self._lock.calculateLocked { () -> Action? in if isAdded { - self._group.removeDisposable(removeKey!) + self._group.remove(for: removeKey!) } else { isDone = true @@ -108,7 +108,7 @@ class AnyRecursiveScheduler { _lock.performLocked { if !isDone { - removeKey = _group.addDisposable(d) + removeKey = _group.insert(d) isAdded = true } } @@ -160,7 +160,7 @@ class RecursiveImmediateScheduler { let action = self._lock.calculateLocked { () -> Action? in if isAdded { - self._group.removeDisposable(removeKey!) + self._group.remove(for: removeKey!) } else { isDone = true @@ -178,7 +178,7 @@ class RecursiveImmediateScheduler { _lock.performLocked { if !isDone { - removeKey = _group.addDisposable(d) + removeKey = _group.insert(d) isAdded = true } } diff --git a/RxSwift/Schedulers/VirtualTimeScheduler.swift b/RxSwift/Schedulers/VirtualTimeScheduler.swift index efd9b000..96974f90 100644 --- a/RxSwift/Schedulers/VirtualTimeScheduler.swift +++ b/RxSwift/Schedulers/VirtualTimeScheduler.swift @@ -128,7 +128,7 @@ public class VirtualTimeScheduler _schedulerQueue.enqueue(item) - _ = compositeDisposable.addDisposable(item) + _ = compositeDisposable.insert(item) return compositeDisposable } diff --git a/Tests/RxCocoaTests/Driver+Test.swift b/Tests/RxCocoaTests/Driver+Test.swift index ba587905..efa89e3c 100644 --- a/Tests/RxCocoaTests/Driver+Test.swift +++ b/Tests/RxCocoaTests/Driver+Test.swift @@ -548,10 +548,10 @@ extension DriverTest { var events = [Int]() - let driver = hotObservable.asDriver(onErrorJustReturn: -1).doOnNext { e in + let driver = hotObservable.asDriver(onErrorJustReturn: -1).do(onNext: { e in XCTAssertTrue(isMainThread()) events.append(e) - } + }) let results = subscribeTwiceOnBackgroundSchedulerAndOnlyOneSubscription(driver) { XCTAssertTrue(hotObservable.subscriptions == [SubscribedToHotObservable]) @@ -572,10 +572,10 @@ extension DriverTest { let hotObservable = BackgroundThreadPrimitiveHotObservable() var completed = false - let driver = hotObservable.asDriver(onErrorJustReturn: -1).doOnCompleted { e in + let driver = hotObservable.asDriver(onErrorJustReturn: -1).do(onCompleted: { e in XCTAssertTrue(isMainThread()) completed = true - } + }) let results = subscribeTwiceOnBackgroundSchedulerAndOnlyOneSubscription(driver) { XCTAssertTrue(hotObservable.subscriptions == [SubscribedToHotObservable]) diff --git a/Tests/RxSwiftTests/Tests/DisposableTest.swift b/Tests/RxSwiftTests/Tests/DisposableTest.swift index acd55d12..58d2e3ce 100644 --- a/Tests/RxSwiftTests/Tests/DisposableTest.swift +++ b/Tests/RxSwiftTests/Tests/DisposableTest.swift @@ -73,11 +73,11 @@ class DisposableTest : RxTest { var numberDisposed = 0 let compositeDisposable = CompositeDisposable() - let result1 = compositeDisposable.addDisposable(AnonymousDisposable { + let result1 = compositeDisposable.insert(AnonymousDisposable { numberDisposed += 1 }) - _ = compositeDisposable.addDisposable(AnonymousDisposable { + _ = compositeDisposable.insert(AnonymousDisposable { numberDisposed += 1 }) @@ -89,7 +89,7 @@ class DisposableTest : RxTest { XCTAssertEqual(numberDisposed, 2) XCTAssertEqual(compositeDisposable.count, 0) - let result = compositeDisposable.addDisposable(AnonymousDisposable { + let result = compositeDisposable.insert(AnonymousDisposable { numberDisposed += 1 }) @@ -131,11 +131,11 @@ class DisposableTest : RxTest { var numberDisposed = 0 let compositeDisposable = CompositeDisposable() - let result1 = compositeDisposable.addDisposable(AnonymousDisposable { + let result1 = compositeDisposable.insert(AnonymousDisposable { numberDisposed += 1 }) - let result2 = compositeDisposable.addDisposable(AnonymousDisposable { + let result2 = compositeDisposable.insert(AnonymousDisposable { numberDisposed += 1 }) diff --git a/Tests/RxSwiftTests/Tests/Observable+ConcurrencyTest.swift b/Tests/RxSwiftTests/Tests/Observable+ConcurrencyTest.swift index 39ddf20e..2d0d50f7 100644 --- a/Tests/RxSwiftTests/Tests/Observable+ConcurrencyTest.swift +++ b/Tests/RxSwiftTests/Tests/Observable+ConcurrencyTest.swift @@ -60,7 +60,7 @@ extension ObservableConcurrencyTest { let compositeDisposable = CompositeDisposable() for test in tests { - _ = compositeDisposable.addDisposable(runDispatchQueueSchedulerTests(scheduler, tests: test)) + _ = compositeDisposable.insert(runDispatchQueueSchedulerTests(scheduler, tests: test)) } compositeDisposable.dispose() diff --git a/Tests/RxSwiftTests/Tests/Observable+SingleTest.swift b/Tests/RxSwiftTests/Tests/Observable+SingleTest.swift index 668103c5..a682e3c5 100644 --- a/Tests/RxSwiftTests/Tests/Observable+SingleTest.swift +++ b/Tests/RxSwiftTests/Tests/Observable+SingleTest.swift @@ -573,9 +573,9 @@ extension ObservableSingleTest { var numberOfTimesInvoked = 0 - let res = scheduler.start { xs.doOnNext { error in + let res = scheduler.start { xs.do(onNext: { error in numberOfTimesInvoked = numberOfTimesInvoked + 1 - } + }) } let correctMessages = [ @@ -610,12 +610,12 @@ extension ObservableSingleTest { var numberOfTimesInvoked = 0 - let res = scheduler.start { xs.doOnNext { error in + let res = scheduler.start { xs.do(onNext: { error in if numberOfTimesInvoked > 2 { throw testError } numberOfTimesInvoked = numberOfTimesInvoked + 1 - } + }) } let correctMessages = [ @@ -647,10 +647,10 @@ extension ObservableSingleTest { var recordedError: ErrorProtocol! var numberOfTimesInvoked = 0 - let res = scheduler.start { xs.doOnError { error in + let res = scheduler.start { xs.do(onError: { error in recordedError = error numberOfTimesInvoked = numberOfTimesInvoked + 1 - } + }) } let correctMessages = [ @@ -678,9 +678,9 @@ extension ObservableSingleTest { error(250, testError) ]) - let res = scheduler.start { xs.doOnError { _ in + let res = scheduler.start { xs.do(onError: { _ in throw testError1 - } + }) } let correctMessages = [ @@ -710,9 +710,9 @@ extension ObservableSingleTest { var didComplete = false - let res = scheduler.start { xs.doOnCompleted { error in + let res = scheduler.start { xs.do(onCompleted: { error in didComplete = true - } + }) } let correctMessages = [ @@ -745,9 +745,9 @@ extension ObservableSingleTest { completed(250) ]) - let res = scheduler.start { xs.doOnCompleted { error in + let res = scheduler.start { xs.do(onCompleted: { error in throw testError - } + }) } let correctMessages = [