일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 | 31 |
- Xcode
- HIG
- Observable
- Refactoring
- map
- RxCocoa
- Clean Code
- rxswift
- 스위프트
- MVVM
- Protocol
- combine
- uitableview
- 클린 코드
- ribs
- uiscrollview
- SWIFT
- clean architecture
- Human interface guide
- swiftUI
- ios
- tableView
- swift documentation
- 애니메이션
- 리팩토링
- collectionview
- UICollectionView
- 리펙토링
- UITextView
- 리펙터링
- Today
- Total
목록combine (16)
김종권의 iOS 앱 개발 알아가기
목차) Combine - 목차 링크 Catch(_:) 에러가 발생할때 해당 에러에 대한 catch에 걸리면 catch에서 리턴한 데이터만 방출하고 위에있던 남은 데이터는 무시 struct MyError: Error {} let _ = [1,2,-3,4,5].publisher .tryMap { guard $0 > 0 else { throw MyError() } return $0 } .catch { error in [9,8,7].publisher } .sink( receiveCompletion: { print("Completion: \($0)") }, receiveValue: { print("Value:", $0) } ) // Value: 1 // Value: 2 // Value: 9 // Value: 8 ..
목차) Combine - 목차 링크 Combining 연산자 * 스트림에서 방출되는 2개 이상의 요소들을 묶어서 방출하는 방법 예제에 사용할 스트림 2개 준비) PassthroughSubject는 downstream subscribers에게 값을 broadcast하는 subject 값을 저장하고 있지는 않고 단순히 값을 토스 해주는 역할 RxSwift의 PublishSubject와 동일 (구체적인 개념은 이전 포스팅 글 참고) let passthroughSubject1 = PassthroughSubject() let passthroughSubject2 = PassthroughSubject() combineLatest(_:_:) 두 스트림 모두 메시지를 받았을때 이벤트 방출 해당 연산자에서 이전 값을 기억..
목차) Combine - 목차 링크 Selecting 연산자 * Combine에서 제공하는 Selecting 연산자는 기존 Swift에서 제공하는 연산자의 인터페이스와 동일하게 설계되어 사용하기 쉽도록 구현 first() [1,2,3,4,5].publisher .first() .sink { print($0) } // 1 last() [1,2,3,4,5].publisher .last() .sink { print($0) } // 5 tryFirst 조건에 해당하는 firrst를 만나기 전까지 throw가 발생 안하면 에러 x struct SomeError: Error {} [1,2,3,4,5].publisher .tryFirst(where: { guard $0 != 3 else { throw SomeErro..
목차) Combine - 목차 링크 Sequence 연산자 drop(while:) 일반 while (condition) { body } 과 동일 while 안에 조건이 true일때만 값을 drop [1,3,5,7,8,9]가 있을때 1, 3, 5, 7 까지 계속 홀수이므로 while문 내부가 true이므로 모두 drop 8에서 while문이 false이므로 while문이 break while문이 break되었으므로 9는 방출 [1,3,5,7,8,9].publisher .drop(while: { $0 % 2 != 0 }) .sink { print($0, terminator: " ") } // 8 9 dropFirst() 첫번째 요소만 drop [1,2,3,4,5].publisher .dropFirst() ...
1. Pagination 방법 (페이지네이션, Combine) - 기초 2. Pagination 방법 (페이지네이션, Combine) - 메인 스레드 최적화, 이미지 캐싱 Pagination 개념 List에서 스크롤할 때 필요한 데이터를 계속 추가적으로 받아오는 형태 대용량의 데이터를 한꺼번에 받아오면 부하가 크므로, 10개를 보여주고 그다음 스크롤이 마지막에 도달할때 그 다음 10개를 보여주는 형식 API를 호출할땐 page Int 값을 다르게 보내면서 데이터를 가져오는 방법 SwiftUI 에서의 Pagination 구현 아이디어 List의 마지막 부분에 로딩뷰를 따로 추가하고, 그 부분이 onAppear 될때 페이지네이션 수행 List { ForEach(items) { item in } if !ite..
목차) Combine - 목차 링크 Map 값 요소들을 하나씩 맵핑 (값에 변화를 주는 연산자) let publisher1 = [1, 2, 3].publisher let cancellable1 = publisher1 .map { $0 + 2 } .sink(receiveValue: { print($0) }) /* 3 4 5 */ tryMap map 클로저 내부에서 예외가 던져질 수 있는 연산이 있을때 사용 예외 처리하는 곳은 sink의 receiveCompletion에서 수행 enum SomeError: Error { case zero } let publisher2 = [2, 1, 0].publisher let cancellable2 = publisher2 .tryMap { guard $0 != 0 els..
목차) Combine - 목차 링크 Scheduler 언제, 어떻게 클로저가 실행될지 정하는 프로토콜 thread 설정도 가능 (main, global) 시간 설정도 가능 Scheduler 사용 방법 스레드 변경 receive(on:): downstream의 스레드 변경 subscribe(on:): upstream의 스레드 변경 receive(on:), subscribe(on:) 안쓴 경우 스레드 확인 DispatchQueue.global()로 실행한 경우, main thread가 아닌 global thread에서 sink의 클로저 부분이 동작 즉, 따로 스케줄러 설정을 하지 않으면 subject의 이벤트를 발행하는 쪽의 스케줄러와 동일하기 sink 클로저 부분이 동작 let subject = Pass..
목차) Combine - 목차 링크 Subject Publisher의 일종이고 (Publisher 프로토콜을 준수하고 있는 형태), 이 인스턴스는 이벤트를 방출할 수 있는 send(subscription:) 기능이 존재 애플에서는 이벤트 방출을 "inject"라고 명명 @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) public protocol Subject : AnyObject, Publisher { func send(subscription: Subscription) } PassthoughSubject downstream subscribers에게 값을 broadcast하는 subject 값을 저장하고 있지는 않고 단순히 값을 토스 해주는 역할..