Skip to content

Instantly share code, notes, and snippets.

let observable = Observable<Int> { (observer) -> Disposable in
observer.on(event: .next(1))
observer.on(event: .next(2))
observer.on(event: .completed)
return AnonimousDisposable {
print("disposed")
}
}
observable.subscribe {
final class Sink<O: ObserverType>: Disposable {
private var _disposed: Bool = false
private let _forward: O
private let _subscriptionHandler: (Observer<O.E>) -> Disposable
private let _composite = CompositeDisposable()
init(forvard: O, subscriptionHandler: @escaping (Observer<O.E>) -> Disposable) {
_forward = forvard
_subscriptionHandler = subscriptionHandler
public class Observable<Element>: ObservableType {
public typealias E = Element
private let _subscribeHandler: (Observer<Element>) -> Disposable
public init(_ subscribtionClosure: @escaping (Observer<Element>) -> Disposable) {
_subscribeHandler = subscribtionClosure
}
public func subscribe<O : ObserverType>(observer: O) -> Disposable where O.E == E {
let sink = Sink(forvard: observer, subscribtionHandler: _subscribeHandler)
public protocol ObservableType {
associatedtype E
func subscribe<O: ObserverType>(observer: O) -> Disposable where O.E == E
}
extension ObservableType {
func paginate<O: ObservableType>(nextPageTrigger: O,
hasNextPage: E -> Bool,
nextPageFactory: E -> Observable<E>) -> Observable<E> {
return flatMap { page -> Observable<E> in
if !hasNextPage(page) {
return Observable.just(page)
}
return [
....
func paginateItems(batch: Batch = Batch.initial,
endPoint: EndPoint,
nextBatchTrigger: Observable<Void>) -> Observable<Page<[Hero]>> {
let params = paramsProvider.pagingListParamsForBatch(batch)
return httpClient
.request(.GET, endPoint,
parameters: paramsProvider.defaultParams + params,
encoding: .URL,
//1
let viewModel = HeroListViewModel(uiTriggers:(
searchQuery: searchCotroller.searchBar.rx_text.asObservable(),
nextPageTrigger: tableView.rx_nextPageTriger,
searchNextPageTrigger: searchContentController.tableView.rx_nextPageTriger
),
api: DefaultHeroAPI(paramsProvider: HeroesParamsProvider.self))
//2
viewModel.mainTableItems
.drive(tableView.rx_itemsWithDataSource(dataSource))
class HeroListViewModel {
let mainTableItems: Driver<[HeroCellSection]>
let searchTableItems: Driver<[HeroCellSection]>
let dismissTrigger: Driver<Void>
init(uiTriggers: (searchQuery: Observable<String>,
nextPageTrigger: Observable<Void>,
searchNextPageTrigger: Observable<Void>,
dismissTrigger: Driver<Void>), api: HeroAPI) {
class HeroListViewModel {
let mainTableItems: Driver<[HeroCellSection]>
let searchTableItems: Driver<[HeroCellSection]>
init(uiTriggers: (
searchQuery: Observable<String>,
nextPageTrigger: Observable<Void>,
searchNextPageTrigger: Observable<Void>
),
class ViewController: UIViewController {
let disposeBag = DisposeBag()
@IBOutlet var pushButton: UIButton!
@IBOutlet var presentButton: UIButton!
@IBOutlet weak var dismissButton: UIButton!
var voidSegue: ModalSegue<ViewController, SecondViewController, Void> {
return ModalSegue(fromViewController: self,
toViewControllerFactory: { (sender, context) -> SecondViewController in