---
# System prepended metadata

title: Combine
tags: [활동학습]

---

## **1.** Stream이란

---

<aside>
💡  RxSwift는 함수형 프로그래밍으로 코드를 작성할 수 있도록 ReactiveX 프로젝트에서 작성한 오픈소스 라이브러리입니다.
 그리고 RxSwift에서는 stream이란 용어를 사용하고 있고, 이는 Combine에서도 사용되고 있음을 여러분이 직접 확인하실 수 있습니다.
 이 때 Stream이란 무엇인가요?

</aside>

### TODO

- Stream이 무엇인지 조사해보고, 자신들만의 언어로 정의해주세요
**Publisher가 자신을 구독한 Subscriber에게 데이터를 보내는 과정**
**데이터 처리 과정**

## 2. Combine을 사용하여 리팩토링 해보기

### TODO
```swift
import Combine

struct Food: Decodable {
    let name: String
    let price: Int
    let description: String
}

struct SomeModelV1 {
    private let decoder = JSONDecoder()
    
    func request(
        fromServer server: SomeServer = SomeServer.shared,
        _ completionHandler: @escaping (Food) -> Void
    ) {
        Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { timer in
            server.forCallback { foodData in
                if let food = try? decoder.decode(Food.self, from: foodData) {
                    completionHandler(food)
                }
            }
        }
    }
    
    func combineRequest(fromServer server: SomeServer = SomeServer.shared) -> AnyPublisher<Food, Error> {
        return Timer.TimerPublisher(interval: 1.0, runLoop: .main, mode: .common)
            .autoconnect()
            .flatMap { date in
                server.forValue().decode(type: Food.self, decoder: decoder)
            }
            .eraseToAnyPublisher()
    }
}

```

```swift
var collection :Set<AnyCancellable> = []

let sub: () = SomeModelV1().combineRequest()
    .sink { error in
    print(error)
} receiveValue: { food in
    print(food)
}.store(in: &collection)
```