Skip to content

Instantly share code, notes, and snippets.

View nalexn's full-sized avatar
😈
Badass software crafting

Alexey Naumov nalexn

😈
Badass software crafting
View GitHub Profile
@nalexn
nalexn / contacts.vcf
Created November 26, 2024 15:26
Dummy contacts for mobile E2E tests
BEGIN:VCARD
VERSION:3.0
PRODID:-//Apple Inc.//iPhone OS 17.0//EN
N:Appleseed;John;;;
FN:John Appleseed
EMAIL;type=INTERNET;type=WORK;type=pref:[email protected]
TEL;type=HOME;type=VOICE;type=pref:888-555-1212
TEL;type=CELL;type=VOICE:888-555-5512
item1.ADR;type=HOME;type=pref:;;1234 Laurel Street;Atlanta;GA;30303;USA
item1.X-ABADR:us
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