지금까지 Combine 내용에선 무조건 성공하는 케이스만 다뤄봤는데, 이번엔 실패했을경우 에러 처리를 어떻게 해야하는지, 어떤 에러처리 방법이 있는지 다뤄보도록 하겠습니다. Never Failure 타입이 Never인 publisher는 erorr가 없는 경우 입니다. example(of: "Never sink") { Just("Hello") .sink(receiveValue: { print($0) }) .store(in: &subscriptions) } Just의 경우 내부를 보면 Failure = Never인걸 확인할 수 있습니다. 만약 Never 타입에서 동작하는 operator(연산자)는 몇개 더 있습니다. 대표적으로 많이 쓰는 `setFailureType`을 먼저 봅시다. setFailureT..
share() 값(value)으로 보다는 참조(reference)로 publisher를 공유할 수 있게 해줍니다. 즉, share() 메서드는 일반적으로 struct로 되어있는 Publisher를 reference타입으로 반환해줌! subscriber는 구독후에 upstream publisher가 방출하는 값을 받게됩니다. subscriber가 upstream publisher가 완료된 공유 publisher를 구독하면, 해당 subscriber는 완료 이벤트(completion event)만 받습니다. import Combine import Foundation let shared = URLSession.shared .dataTaskPublisher(for: URL(string: "https://www...
Key-Value Observing publisher(for:) 단일 변수의 변화를 관찰하려면? KVO(Key-Value Observing)를 준수하는 객체의 모든 속성에 대한 게시자를 제공합니다. ObservableObject 프로토콜은 여러 변수가 변경될 수 있는 경우를 처리합니다. KVO는 Objective-C의 필수 구성 요소였고, Foundation, UIKit 및 AppKit 클래스 대부분의 프로퍼티는 KVO를 준수합니다. 따라서, KVO를 사용하여 변화를 관찰할 수 있습니다. KVO를 준수하는 프로퍼티를 관찰하는 방법 (OperationQueue를 이용) import Combine import Foundation let queue = OperationQueue() let subscriptio..
Timers 타이머를 구현하려면 아래와 같은 방법이 있습니다. RunLoop Timer class DispatchQueue RunLoop NOTE Apple 공식문서에서 RunLoop 클래스는 thread safe 하지 않아, 현재 thread에서만 RunLoop 메서드를 호출해야 한다고 합니다. 아래는 RunLoop를 활용해 1초마다 print를 하는 timer를 만든 예제 입니다. import Foundation let runLoop = RunLoop.main let subscription = runLoop.schedule( after: runLoop.now, interval: .seconds(1), tolerance: .milliseconds(100)) { print("Timer fired") }..
Printing events print(_:to:) 디버깅을 할때 print(_:to:) 메서드로 chain메서드 중간중간 상황을 파악할 수 있습니다. import Combine import Foundation let subscription = (1...3).publisher .print("publisher") .sink { _ in } // 1 //publisher: receive subscription: (1...3) // 2 //publisher: request unlimited // 3 //publisher: receive value: (1) //publisher: receive value: (2) //publisher: receive value: (3) // 4 //publisher: recei..
Shifting time publisher에서 방출하는 이벤트를 지연시키는 연산자를 알아보겠습니다. delay(for:tolerance:scheduler:options) upstream 에서 값을 방출할 때마다 잠시 동안 지연시켜 다음 지정한 스케줄러에서 방출합니다. import Combine import SwiftUI import PlaygroundSupport // 1 let valuesPerSecond = 1.0 let delayInSeconds = 1.5 // 2 let sourcePublisher = PassthroughSubject() // 3 let delayedPublisher = sourcePublisher.delay(for: .seconds(delayInSeconds), schedule..
오늘은 이어서 Combining 연산자에 대해 공부해 보겠습니다. Prepending upstream에서 방출한 값 앞에 추가해서 보내는 용도로 사용합니다. prepend(Output) publisher에서 방출 되는 이벤트 이전에 값을 넣어줄 때 사용합니다. var subscriptions = Set() example(of: "prepend(output)") { let publisher = [3, 4].publisher publisher .prepend(1, 2) .sink(receiveValue: { print($0) }) .store(in: &subscriptions) } /* ——— Example of: prepend(output) ——— 1 2 3 4 */ 아래처럼 음수 를 추가해도 순서대로 ..
이전 챕터와 비슷하게 filtering 연산자에 대해 공부해 보려 합니다. Filtering basics filter() Swift에 있는 filter와 같습니다. (조건문과 성립하는것만 걸러냄) var subscriptions = Set() example(of: "filter") { // 1. 1~10까지 이벤트 방출 let numbers = (1...10).publisher // 2. filter 연산자로, 3의 배수만 걸러냄 numbers .filter { $0.isMultiple(of: 3) } // isMultiple of의 지정된 숫자의 배수이면 true 반환 .sink(receiveValue: { num in print("\(num) 은 3의 배수") }) .store(in: &subscri..
- Total
- Today
- Yesterday
- Swift joined
- Swift joined()
- Swift 내림차순
- swift (programmers)
- RTCCameraVideoCapturer
- Swift Leetcode
- removeLast()
- swift protocol
- swift reduce
- Swift Error Handling
- iOS error
- swift programmers
- Swift ModernRIBs
- Class
- CS 네트워크
- swift property
- Swift final
- ios
- 2023년 회고
- Swift 프로퍼티
- Swift 프로그래머스
- Swift inout
- swift 고차함수
- Swift 알고리즘
- Swift
- Swift RIBs
- RIBs tutorial
- Swift init
- 원티드 프리온보딩
- Combine: Asynchronous Programming with Swift
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |