Skip to content

Instantly share code, notes, and snippets.

View nalexn's full-sized avatar
😈
Designing software the ruthless way

Alexey Naumov nalexn

😈
Designing software the ruthless way
View GitHub Profile
class HomeViewModel: ObservableObject {
@Published var isLoadingData = false
func doSomething() { ... }
}
class HomeViewController: UIViewController {
let loadingIndicator: UIActivityIndicatorView!
let viewModel = HomeViewModel()
viewModel.$userName // Publisher
.asObservable() // Observable
.bind(to: nameLabel.rx.text) // RxCocoa binding
.disposed(by: disposeBag)
viewModel.$userName
.sink { [weak self] name in
self?.nameLabel.text = name
}
.store(in: &cancelBag)
import RxCombine
import RxCocoa
extension Driver {
var publisher: AnyPublisher<Element, Never> {
return self.asObservable()
.publisher
.catch { _ in Empty<Element, Never>() }
.eraseToAnyPublisher()
}
struct HomeView: View {
let viewModel: HomeViewModel
@State var isLoadingData = false
var body: some View {
if isLoadingData {
ProgressView()
}
Button("Do something!") {
extension HomeViewModel {
class Adapter: ObservableObject {
let viewModel: HomeViewModel
private let disposeBag = DisposeBag()
@Published var isLoadingData = false
init(viewModel: HomeViewModel) {
extension ObservableObject {
func binder<Value>(_ keyPath: WritableKeyPath<Self, Value>) -> Binder<Value> {
Binder(self) { (object, value) in
var _object = object
_object[keyPath: keyPath] = value
}
}
}
let observable: Observable<Bool> = ...
observable
.bind(to: self.binder(\.isLoadingData))
.disposed(by: disposeBag)
let driver: Driver<Bool> = ...
driver
.drive(self.binder(\.name))
.disposed(by: disposeBag)
extension HomeViewModel {
class Adapter: ObservableObject {
let viewModel: HomeViewModel
@Published var isLoadingData = false
}
}
struct HomeView: View {
let adapter: HomeViewModel.Adapter
class HomeViewModel {
let isLoadingData: Driver<Bool>
let disposeBag = DisposeBag()
func doSomething() { ... }
}
class HomeViewController: UIViewController {