Combine
함수형 반응형 프로그래밍을 위한 프레임워크이자
비동기적인 데이터 스트림을 다루고 조작하는데 사용
반응형 프로그래밍이란?
데이터 스트림 or 데이터의 변화에 따라 코드가 자동으로 반응하는 프로그래밍 패러다임
(데이터의 변경 사항을 감지하고 이에 따라 연속적으로 반응하는 방식으로 프로그램을 작성)
데이터 스트림(Data Stream)
이벤트 스트림, 값의 흐름 등과 같이 시간에 따라 연속적으로 발생하는 데이터의 흐름
(사용자 입력, 센서 데이터, 외부 API의 응답 등 다양한 소스에서 나타남)
옵저버(Observer) 패턴
데이터의 변화를 감시, 변화에 따라 특정 작업을 수행하는 디자인 패턴
변화가 일어나면 옵저버(또는 구독자)는 해당 변화에 반응하여 알림을 받고, 필요한 작업을 수행
스트림의 변환과 조작
(Transforming and Manipulating Streams)
데이터 스트림을 조작하여 필터링, 매핑, 결합, 변환 등을 수행하여 새로운 스트림을 생성
(이를 통해 데이터 스트림을 효과적으로 처리 및 필요한 형태로 가공)
바인딩(Binding)
- 데이터의 변화와 이에 따른 작업의 연결
- 데이터와 UI 요소, 또는 데이터와 작업 사이의 연결을 설정 -> 데이터의 변경이 발생시 UI나 다른 작업을 자동으로 업데이트
- 바인딩은 데이터의 변화와 연관된 작업이 서로 결합 -> 하나의 변화가 다른 작업에 자동으로 전달 및 반영
(많은 프레임워크와 라이브러리들이 반응형 프로그래밍을 지원, 데이터 스트림의 변화를 쉽게 처리하고 반응형으로 프로그래밍 가능)
Combine 이란..
Apple의 Swift 프로그래밍 언어에 포함된 프레임워크
비동기적인 이벤트 스트림을 처리하고 조작하는 데 사용
(함수형 프로그래밍과 반응형 프로그래밍 개념을 기반,
데이터 스트림을 간단하게 조작하고 조합할 수 있는 도구를 제공)
Publisher(발행자)
데이터 스트림을 생성, 이벤트를 방출하는 타입
값 방출 가능, 오류 방출 혹은 작업 완료 알림가능
Subscriber(구독자)
Publisher에서 방출되는 이벤트를 받아 처리하는 타입
값을 받아 처리하거나, 오류나 작업 완료 이벤트를 처리
Operators(연산자)
Combine 프레임워크에는 데이터 스트림을 조작하고 변환하기 위한 다양한 연산자가 제공
map, filter, flatMap 등의 연산자를 사용하여 데이터 스트림을 조작하고 새로운 형태로 변환가능
Cancellable(취소 가능한)
구독을 취소할 수 있는 타입인 **Cancellable**이 제공
구독을 취소함으로써 더 이상 이벤트를 받지 않도록 설정가능
// Combine 예시
import Foundation
class DataModel {
var textValue: String = ""
func updateText(to newValue: String) {
textValue = newValue
print("Value updated: \(textValue)")
}
}
let dataModel = DataModel()
dataModel.updateText(to: "Hello, Swift!")
dataModel.updateText(to: "Another value")
/*
출력
Value changed to: Hello, Swift!
Value changed to: Another value
*/
/*
위 Combine예시 풀이 = DataModel이라는 클래스와 textValue 프로퍼티 그리고 updateText 함수
이 메서드는 말 그대로 텍스트를 업데이트하는 것을 의미하고 있습니다.
newValue 파라미터를 받아 textValue에 넣어주고, textValue를 해서 프린트를 해주는 것 입니다.
이후 "let dataModel = DataModel()" 이후 dataModel.updateText 텍스트를 업데이트 해줍니다.
즉, DataModel 이라는 인스턴스에 updateText를 호출을 해주면, 위와 같이 출력이 됩니다.
*/
// didset을 이용한 예시
// didset은 옵저버라고 하며, 관찰(감지)하는 역할을 합니다.
class DataModel {
var textValue: String = "" {
didSet {
print("Value updated: \(textValue)")
}
}
}
let dataModel = DataModel()
func changeText(to newValue: String) {
dataModel.textValue = newValue
}
changeText(to: "Hello, Swift!")
changeText(to: "Another value")
/*
출력
Value changed to: Hello, Swift!
Value changed to: Another value
*/
/*
didSet을 이용하면 함수가 필요 없으며, 단순히 textValue에 didSet 프로퍼티 옵저버만 있으면 됩니다.
changeText라는 클래스 외부 함수를 만들어 주는데 이는 단순하게 newValue 받아서 인스턴스 textValue에
값을 넣어주는 형태입니다. 이후 changeText를 호출을 해주면
위 선언된 didSet이 textValue의 변화를 감지하여 그 값을 넣어주어 그 값을 호출해주는 형태를 보여줍니다.
*/
// combine 예시
import Foundation
import Combine
class DataModel {
@Published var textValue: String = ""
}
let dataModel = DataModel()
let cancellable = dataModel.$textValue.sink { newValue in
print("Value changed to: \(newValue)")
}
dataModel.textValue = "Hello, Combine!"
dataModel.textValue = "Another value"
/*
출력
Value changed to:
Value changed to: Hello, Combine!
Value changed to: Another value
*/
/*
import Combine을 해주고, DataModel을 생성해줍니다.
DataModel에서 textValue가 있는데, @Published를 볼 수 있습니다. 이는 프로퍼티 래퍼 라고 합니다.
@Published를 사용하면 값이 변경될 때마다 변경사항을 전파를 해줍니다.
이후 cancellable이라는 변수에 DataModel의 textValue 앞에 $를 붙이고 .sink를 사용한 것을 볼 수 있습니다.
그 다음 뒤에 클로저가 따라옵니다. "{ newValue in"
즉, ".$textValue.sink"는 변경사항을 받을 수 있음을 의미하며,
그 변경사항을 구독할 수 있는 것이 .sink 입니다.
그말은 즉슨 ".$textValue" textValue가 전파되는 것을 .sink가 받는 것을 이야기 하며,
파라미터 이벤트가 "{ newValue in" 이곳으로 들어오게 되는 것을 말 합니다.
차이가 있다면, 처음 " textValue: String = "" " 여기서 textValue는 빈 문자열 입니다.
이는 문자열이 있는 상태임을 알 수 있는 것이죠. 그렇기 때문에 "" 이것도 전파가 됩니다.
그래서 전파가 된것을 .sink가 구독을 하였기 때문에 처음에 빈문자열임을 알 수 있었으며,
textValue에 원하는 문자를 넣어주면 그 변경사항이 전파가 되어 .sink가 구독을하게 됩니다.
*/
"DataModel" 클래스는 "@Published 프로퍼티 래퍼"를 사용하여 "textValue"를 선언
"@Published 프로퍼티 래퍼"는 값이 변경될 때마다 해당 값의 변경 사항을 게시(publish)
"let cancellable = dataModel.$textValue.sink { newValue in ... }"에서
"$textValue"는 "textValue"의 Publisher를 나타냄
"sink" 연산자는 이 "Publisher"를 구독(subscribe)하고, 값의 변경 사항이 있을 때마다 클로저 내의 코드를 실행
dataModel.textValue = "Hello, Combine!" 코드는 "textValue"의 값을 변경
(sink 클로저 내의 코드가 실행되어 "Value changed to: Hello, Combine!"를 출력)
dataModel.textValue = "Another value"도 동일한 방식으로 값의 변경과 해당 변경 사항에 대한 출력
'IOS > Swift-Study' 카테고리의 다른 글
[Swift-Study] IOS 앱 개발 입문 1주차 - IOS 개요 (0) | 2024.03.29 |
---|---|
[Swift-Study] 심화 문법종합반 2주차 5일차 정리 - RxSwift 맛보기 (0) | 2024.03.28 |
[Swift-Study] 심화 문법종합반 2주차 5일차 정리 - 비동기와 네트워킹 (0) | 2024.03.28 |
[Swift-Study] 심화 문법종합반 2주차 5일차 정리 - 제네릭 (2) | 2024.03.27 |
[Swift-Study] 심화 문법종합반 2주차 4일차 정리 - 확장 (0) | 2024.03.27 |