Skip to content

Instantly share code, notes, and snippets.

struct Book {
let title: String
}
protocol Api {
func getBooks() -> Observable<[Book]>
func deleteBook(_ book: Book) -> Single<Book>
}
class DummyApi: Api {
var userBooks = "Book 1", "Book 2", "Book 3"
func getBooks() -> Observable<[Book]> {
return userBooks
}
func deleteBook(_ book: Book) -> Single<Book> {
...wait 0.5s...
import RxSwift
import RxCocoa
class BooksViewModel {
// MARK: inputs
let deleteCommand = PublishRelay<IndexPath>()
// MARK: outputs
let items: Observable<[Book]>
deleteCommand
.map { $0.row }
// convert Int (position) into element of books collection
// pass it to API method
deleteCommand
.map { $0.row }
.withLatestFrom(items) { rowIndex, items in
return items[rowIndex]
}
deleteCommand
.map { $0.row }
.withLatestFrom(items) { rowIndex, items in
return items[rowIndex]
}.flatMap(api.deleteBook)
.subscribe()
.disposed(by: disposeBag)
struct SectionOfBooks {
var header: String?
var items: [Book]
}
func createDataSource() -> RxTableViewSectionedAnimatedDataSource<SectionOfBooks> {
return RxTableViewSectionedAnimatedDataSource(
configureCell:{ (ds, tableView, indexPath, book) in
let cell = tableView.dequeueReusableCell(...)
cell.textLabel?.text = book.title
import UIKit
import RxDataSources
import RxSwift
class ViewController: UIViewController {
@IBOutlet weak var tableView: UITableView!
let dataSource = createDataSource()
let disposeBag = DisposeBag()
tableView.rx.itemDeleted
.bind(to: viewModel.deleteCommand)
.disposed(by: disposeBag)