Combine을 살짝 터치해보세요.

12671 단어 SwiftCombine

Combine을 살짝 터치해보세요.


처음 뵙겠습니다tiking.
Aizu Advent Calendar 2019의 17일째.
지방 대학에서 공부하다.스위프트는 아직 초보자이기 때문에 따뜻한 시선으로 지켜봐 주세요.
이번에 iOS용 VM with Combine 자습서를 통해 배운 OutPut이 있으면 좋겠다고 생각해서 기사를 썼어요.

무슨 일이야?


Combine는 애플이 시작한 UI 이벤트, 인터넷 통신 등 비동기적으로 제공하는 데이터를 처리하는 프레임워크이다.

뭐 할 수 있어요?


예를 들어, 문자의 입력 제한에 사용할 수도 있습니다.
이외에도 많이 응용할 수 있다.

구성 요소 및 역할


• Publisher → 데이터 생성
• Subscriber → 데이터 수신
・ Operator → 가공 데이터
· Subscription → Publisher와 Subscriber의 연결.
에 설명된 해당 매개변수의 값입니다.
관계도는 이런 느낌이에요.
각 구성 요소에 대한 설명 Publisher · Output, Failure의 정의가 적혀 있습니다. → 성공 시 데이터 유형과 실패 시 데이터 유형을 정의합니다. ・receive(subscriber:)의 실현 → Publisher 프로토콜을 실현하는 데 필요한 방법 receive(subscriber:). 이 방법은subscriber가subscribe를 진행할 때 불린다. 즉, 나는 이 방법이 사건 발행을 스스로 책임지는 부분이라고 생각한다. Subscriber · 정의에서 프로토콜로 정의합니다. ·sink(receiveCompletion:receiveValue:)는 이벤트의 완성 상태를 받아들이고 임의의 모듈에 적힌 처리를 실행합니다.·assign(to:on:) 이것은 의미한다Key-Chain드릴게요.
속성을 포함하는 대상을 on에 전달할 수 있습니다.

즉, 이 방법은 관계 변화의 생명주기 사건의 위치를 묘사하는 것이다.


Operator


이 방면에 대한 이해는 아직 간단하기 때문에 간단한 것만 두 개 먹는다
・Prepend
Publisher 앞에 값을 출력하기 위해 Publisher 를 삽입합니다.
・Append
Prepend와 반대로 객체 Publisher 다음에 값을 내보냅니다.

즉, 이 방법은 받아들인 값을 가공할 때 사용한다.


DEMO


DEMO.일


이것은 Publisher와 Subscriber의 간단한 통신입니다.

import Foundation
import Combine

enum  WeatherError : Error {
case  thingsJustHappen
}

let  Publisher = PassthroughSubject<Int, WeatherError>()

let  subscriber = Publisher
.filter{$0 > 25}
.sink(receiveCompletion: {_ in}, receiveValue: {print("reseive value is \($0)")})


let anotherSubscriber = Publisher.handleEvents(receiveSubscription: {Subscription in print("New Subscription is \(Subscription)")}, 
receiveOutput: {output in print("New Value output is \(output)")}, receiveCompletion: {error in print("Subscription completed with potential error is \(error)")}, 
receiveCancel: {print("Subscription Canseled")})
.sink(receiveCompletion: {_ in}, receiveValue: {print("reseive value is \($0)")})


Publisher.send(30)
Publisher.send(20)
Publisher.send(completion: Subscribers.Completion<WeatherError>.failure(.thingsJustHappen))
Publisher.send(100)
Output
이것은 오류를 받아들여 끝낸 처리이다
receive Completion: {error in print("Subscription completed with potential error is(error)")}, 진행 중이기 때문에 이후에는 통신을 하지 않습니다.
New Subscription is PassthroughSubject
reseive value is 30
New Value output is 30
reseive value is 30
New Value output is 20
reseive value is 20
Subscription completed with potential error is failure(__lldb_expr_1.WeatherError.thingsJustHappen)

DEMO.이


이것은 시간으로 문자를 입력한 문자가 사라지는 설치입니다.
이 예에서 다섯 글자가 넘으면 사라진다.
import SwiftUI
import Combine

struct ContentView: View {
    @ObservedObject private var inputchar = RestrictInput(5)
    var body: some View {
        Form{
            TextField("input text", text: $inputchar.text)
            .textFieldStyle(RoundedBorderTextFieldStyle())
            .padding()
            Text("入力されたのは、\(inputchar.text)")
        }
    }
}


//文字を規定数入力すると消してくれるクラス
class RestrictInput: ObservableObject {
    @Published var text = ""
    private var canc: AnyCancellable!
    init (_ maxLength: Int) {
        canc = $text
            .debounce(for: 1, scheduler: DispatchQueue.main)
            .map { String($0.prefix(maxLength)) }
            .assign(to: \.text, on: self)
    }
    deinit {
        canc.cancel()
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

참고로 보도하다


#keyPath 및 KeyPath
첫 번째 Combine 애플 비동기 프레임워크를 사용해 보도록 하겠습니다.
애플 공식 구독자
[iOS] Combine 프레임워크 요약
사과 공식

총결산


자신도 아직 공부가 부족한 부분이 있습니다. 이해하기 어려운 부분도 있을 수 있습니다. 여기까지 읽어 주셔서 감사합니다.
잘못된 점이 있으면 알려주세요.
앞으로도 열심히 공부하겠습니다. 잘 부탁드립니다.

좋은 웹페이지 즐겨찾기