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
49 lines
1.6 KiB
//
|
|
// bufferWithTrigger.swift
|
|
// RxSwiftExt
|
|
//
|
|
// Created by Patrick Maltagliati on 11/12/18.
|
|
// Copyright © 2018 RxSwift Community. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
import RxSwift
|
|
|
|
extension ObservableType {
|
|
/**
|
|
Collects the elements of the source observable, and emits them as an array when the trigger emits.
|
|
|
|
- parameter trigger: The observable sequence used to signal the emission of the buffered items.
|
|
- returns: The buffered observable from elements of the source sequence.
|
|
*/
|
|
public func bufferWithTrigger<U>(_ trigger: Observable<U>) -> Observable<[Element]> {
|
|
return Observable.create { observer in
|
|
var buffer: [Element] = []
|
|
let lock = NSRecursiveLock()
|
|
let triggerDisposable = trigger.subscribe { event in
|
|
lock.lock(); defer { lock.unlock() }
|
|
switch event {
|
|
case .next:
|
|
observer.onNext(buffer)
|
|
buffer = []
|
|
default:
|
|
break
|
|
}
|
|
}
|
|
let disposable = self.subscribe { event in
|
|
lock.lock(); defer { lock.unlock() }
|
|
switch event {
|
|
case .next(let element):
|
|
buffer.append(element)
|
|
case .completed:
|
|
observer.onNext(buffer)
|
|
observer.onCompleted()
|
|
case .error(let error):
|
|
observer.onError(error)
|
|
buffer = []
|
|
}
|
|
}
|
|
return Disposables.create([disposable, triggerDisposable])
|
|
}
|
|
}
|
|
}
|