티스토리 뷰
안녕하세요. 밀쿄입니다.
오늘은 콤바인에서 시퀀스에 대해서 알아보겠습니다.
시퀀스는 인자로 sequence라는 이름으로 시퀀스를 받습니다.
말에서 느껴지듯이 sequence인자는 지난 시간에 알아봤던 그 Sequence프로토콜을 채택하고 있어야합니다.
그럼 어떻게 작동하는 지 한 번 살펴보도록 하겠습니다.
참고로 이 놈은 Convenience Publishers가 아니므로 사용할 때는 앞에 Publishers라고 붙여줘야합니다
그럼 이제 코드를 살펴보도록 하겠습니다
Publishers.Sequence<[Int],Never>(sequence: [1,2,3])
.sink(receiveCompletion: { completion in
switch completion {
case .failure:
print("FAIL")
case .finished:
print("finished")
}
}) { value in
print(value)
}
//결과
1
2
3
finished
코드에 보이듯이 시퀀스에 있는 요소들을 하나씩 내려보내주는 역할을 합니다.
그리고 시퀀스에 있는 요소를 전부 내려보냈다면 종료가 됩니다.
정말 간단한 퍼블리셔라고 생각되어지네요.
Sequence에 대한 설명은 여기까지 입니다.
더 궁금한 점이 있으시면 언제든 댓글을 달아주세요.
끝.
그럼 이번 시간에도 어김없이 opencombine쪽 소스를 보겠습니다.
combine은 오픈소스가 아니므로 대략적인 감을 잡는 용도로만 참고하시면 될 것 같습니다
public struct Sequence<Elements: Swift.Sequence, Failure: Error>: Publisher {
public typealias Output = Elements.Element
public let sequence: Elements
public init(sequence: Elements) {
self.sequence = sequence
}
이렇게 생겼습니다.
Output은 시퀀스 프로토콜에 있는 Element를 내보내는군요
초기화할 떄는 시퀀스 프로코톨을 채택되어 있는 Elements를 받습니다.
간단한네요.
그럼 이걸 sink하면 어떻게 될까요?
extension Publisher {
public func sink(
receiveCompletion: @escaping (Subscribers.Completion<Failure>) -> Void,
receiveValue: @escaping ((Output) -> Void)
) -> AnyCancellable {
let subscriber = Subscribers.Sink<Output, Failure>(
receiveCompletion: receiveCompletion,
receiveValue: receiveValue
)
subscribe(subscriber)
return AnyCancellable(subscriber)
}
}
내부에서 Subscribers.Sink를 돌려 subscriber를 만들어준 후 subscribe에 넘겨주네요.
그럼 저 subscribe는 무엇일까요
extension Publisher {
public func subscribe<Subscriber: OpenCombine.Subscriber>(_ subscriber: Subscriber)
where Failure == Subscriber.Failure, Output == Subscriber.Input
{
receive(subscriber: subscriber)
}
}
자 subscribe가 receive를 부르고 있었습니다.
그럼 다시 시퀀스에 receive를 보도록 하겠습니다.
public func receive<Downstream: Subscriber>(subscriber: Downstream)
where Failure == Downstream.Failure,
Elements.Element == Downstream.Input {
var iterator = sequence.makeIterator()
if iterator.next() != nil {
let inner = Inner(downstream: subscriber, sequence: sequence)
subscriber.receive(subscription: inner)
} else {
subscriber.receive(subscription: Subscriptions.empty)
subscriber.receive(completion: .finished)
}
}
일단 sequence의 next가 nil이면 종료라고 지난 포스팅에서 작성했었습니다.
즉 종료일떄와 아닐 때가 구분되어져 있습니다.
이 다음부터는 지난 번에 알아본 Just처럼 subscriber.receive를 호출하면 Sequence에 있는 request가 돌아가게 됩니다.
결국 여기서 알 수 있었던건... "sink"를 해도 결국 내부에선 Subscirbers.Sink가 돌아가고 있었다..라는 거네요..
그럼 감사합니다.
참고 자료들
'Combine' 카테고리의 다른 글
Combine을 시작하기 전에 (0) | 2020.02.14 |
---|---|
CombineLatest (0) | 2020.02.11 |
[Combine]Just (0) | 2019.12.16 |
[Combine] Scheduler (0) | 2019.12.15 |
[Combine] Cancellable (0) | 2019.12.13 |
- Total
- Today
- Yesterday
- replaceNil
- 결합연산자
- iOSCombine
- 스위프트
- ErrorHandling
- 스유
- 알고리즘
- compactMap
- swift
- BBIK
- Apple
- 자료구조
- combine
- 스위프트유아이
- 현업이그리운
- ios
- MVC
- programmers
- 스택뷰
- SEQUENCE
- SwiftUI
- Just
- 콤바인
- CombineLatest
- UIViewControllerRepresentable
- 텔큐온
- 유니온파인드
- AutoLayout
- Queue
- 삨
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |