일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- SWIFT
- UICollectionView
- swiftUI
- Xcode
- ios
- MVVM
- Observable
- Clean Code
- collectionview
- uitableview
- combine
- 애니메이션
- tableView
- 클린 코드
- HIG
- UITextView
- rxswift
- Protocol
- RxCocoa
- ribs
- 리펙터링
- swift documentation
- uiscrollview
- 스위프트
- clean architecture
- Human interface guide
- 리팩토링
- 리펙토링
- Refactoring
- map
- Today
- Total
목록분류 전체보기 (1642)
김종권의 iOS 앱 개발 알아가기
Traits란? UI처리에 특화된 Observable (MainThread에서 실행, Error이벤트가 없음) Traits를 구독하는 모든 구독자는 동일한 시퀀스를 공유 (share연산자가 내부적으로 사용된 상태) Control Property Traits중에 가장 기본형 (Main스케줄러, error이벤트를 발생하지 않음, 동일한 시퀀스 공유) rx네임 스페이스와 함께 사용: textField.rx.text.orEmpty Control Event event를 Observable로 래핑한 속성 (여기서의 event는 버튼을 tap하는 등의 이벤트를 얘기) Observable의 역할은 수행하짐나, ControlProperty와는 다르게 Observer의 역할은 수행하지 못함 control이 해제될 경우 C..
Observable 아이템을 소유하고 있고 일정 기간 계속해서 이벤트를 비동기적으로 방출(emit) ObservableConvertibleType 가장 최상위에 위치한 프로토콜이며, 기본으로 asObservable이라는 메소드가 있으며 asSingle , asDriver , asSharedSequence 세가지 유형의 확장 메소드가 존재 // // ObservableConvertibleType.swift // RxSwift // // Created by Krunoslav Zaher on 9/17/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. // public protocol ObservableConvertibleType { associate..
1. precedencegroup 설정 precedencegroup ForwardApplication { associativity: left // 왼쪽 연관성: 왼쪽에서 오른쪽으로 연산되게끔 // lowerThan: AdditionPrecedence // 의미: 덧셈을 먼저 처리 // higherThan: CastingPrecedence } infix operator |>: ForwardApplication public func |> (x: A, f: (A) -> B) -> B { return f(x) } precedencegroup 스위프트는 그룹을 설정하여 우선순위를 정하기 때문에, 새로운 연산자에 대한 우선순위를 결정하기 위해 precedencegroup을 설정해야 함 infix infix: 1+1..
share * 원래 Observable은 subscribe될 때만 create클로저를 호출하여 Observable을 생성 (== subscribe한 횟수만큼 새로운 시퀀스 생성) // API를 요청, 결과를 반환하는 시퀀스라 가정 let networkRequestAPI = Observable.of(100) let result = requestMoreButton.rx.tap .flatMap { networkRequestAPI } result .map { $0 > 0 } .bind(to: requestMoreButton.rx.isHidden) .disposed(by: bag) result .map { "Count:\($0)" } .bind(to: remainCountLabel.rx.text) .dispose..
merge 단순히 모든 event를 결합 (단 순서는 번갈아 가며) let disposeBag = DisposeBag() let first = Observable.of(1, 2, 3) let second = Observable.of(4, 5, 6) Observable.merge(first, second) .subscribe(onNext: { print($0) }) .disposed(by: dispseBag) /* Prints: 1 4 2 5 3 6 */ combineLatest 여러 소스 중에서 단 한 가지라도 이벤트를 방출하면, 각각 소스의 맨 마지막 값을 뽑아서 새로운 값을 방출 한 번 값을 방출한 이후에는 클로저가 각각의 Observable이 방출했었던 최신 값을 받음 - ex) 이메일과 비밀번호가..
debounce 입력 -> 바로 입력 안되고 대기 -> 일정 시간 후 입력 주로 텍스트 필드 입력에 사용 코드 (쉬운 예시를 위해서 버튼 입력에 적용) btnDebounce.rx.tap.asDriver() .debounce(.seconds(3)) .drive(onNext: { (_) in self.debounceCount += 1 self.lblDebounce.text = "\(self.debounceCount)" }).disposed(by: disposeBag) throttle 입력 - > 바로 입력 -> 대기 주로 버튼 중복 입력 방지에 사용 코드 btnThrottle.rx.tap.asDriver() .throttle(.seconds(3)) .drive(onNext: { (_) in self.thro..
개념: 연달아 중복된 값이 올 때 무시 Observable.of(1, 2, 2, 1, 3) .distinctUntilChanged() .subscribe(onNext: { print($0) }) .disposed(by: disposeBag) /* Prints : 1 2 1 3 /*
1. flatMap - Observable관련 이벤트를 받아서, 새로운 Observable 방출 let sequenceInt = Observable.of(1, 2, 3) let sequenceString = Observable.of("A", "B", "C", "D") sequenceInt .flatMap { (x: Int) -> Observable in print("Emit Int Item : \(x)") return sequenceString } .subscribeNext { print("Emit String Item : \($0)") } // Output Emit Int Item : 1 Emit String Item : A Emit String Item : B Emit String Item : C E..