You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

49 lines
1.6 KiB

5 years ago
  1. //
  2. // bufferWithTrigger.swift
  3. // RxSwiftExt
  4. //
  5. // Created by Patrick Maltagliati on 11/12/18.
  6. // Copyright © 2018 RxSwift Community. All rights reserved.
  7. //
  8. import Foundation
  9. import RxSwift
  10. extension ObservableType {
  11. /**
  12. Collects the elements of the source observable, and emits them as an array when the trigger emits.
  13. - parameter trigger: The observable sequence used to signal the emission of the buffered items.
  14. - returns: The buffered observable from elements of the source sequence.
  15. */
  16. public func bufferWithTrigger<U>(_ trigger: Observable<U>) -> Observable<[Element]> {
  17. return Observable.create { observer in
  18. var buffer: [Element] = []
  19. let lock = NSRecursiveLock()
  20. let triggerDisposable = trigger.subscribe { event in
  21. lock.lock(); defer { lock.unlock() }
  22. switch event {
  23. case .next:
  24. observer.onNext(buffer)
  25. buffer = []
  26. default:
  27. break
  28. }
  29. }
  30. let disposable = self.subscribe { event in
  31. lock.lock(); defer { lock.unlock() }
  32. switch event {
  33. case .next(let element):
  34. buffer.append(element)
  35. case .completed:
  36. observer.onNext(buffer)
  37. observer.onCompleted()
  38. case .error(let error):
  39. observer.onError(error)
  40. buffer = []
  41. }
  42. }
  43. return Disposables.create([disposable, triggerDisposable])
  44. }
  45. }
  46. }