[SWIFT] Schneller Mähdrescher Erster Schritt

Überblick

Für diejenigen, die Swift noch nicht kennen und ein Gefühl für Combine bekommen möchten. Hier ist ein einfacher Code.

Das heutige Beispiel

Das Ziel ist es, dies heute zu verstehen! Du musst es nicht wissen. Ich werde es später erklären. Wer versteht, muss es nicht lesen.

import Combine

let a = CurrentValueSubject<Int, Never>(3)
let b = Just(1)

let publisher = b.combineLatest(a).map{b,a in a + b}

publisher.sink{ added in
    print(added)
}
a.send(10)

Ich denke nicht, dass es wirklich Sinn macht, aber was wird wahrscheinlich in der Standardausgabe (Druck) angezeigt?

Die Antwort ist

4
11

Es werden zwei Zeilen angezeigt. Die erste "4" ist "3 + 1" Die nächste 11 ist "10 + 1".

Vorerst importieren

Import kombinieren


import Combine

Sie können es mit tun. Verfügbar für ** iOS 13 ** und höher.

Sie können es ganz einfach auf dem Spielplatz ausprobieren.

Begriff kombinieren

Herausgeber und Abonnent sind die Begriffe, an die Sie sich vorerst in Combine erinnern sollten.

Name Japanische Lesung Was tust du
Publisher Herausgeber Daten veröffentlichen
Subscriber Teilnehmer Daten abonnieren

Sie müssen es nicht verstehen, also merken Sie sich vorerst 2 Wörter! Publisher, Subscriber

Nur vorerst

Nur ist (wahrscheinlich) der einfachste Verlag.

Sehen wir uns vorerst die Definition an. (Auszug)

@available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *)
public struct Just<Output> : Publisher {
   // ... (Kürzung)
}

Derzeit ist es ein Publisher, der den Publisher erbt. Es scheint wahr zu sein, dass es nur mit iOS 13.0 oder höher verwendet werden kann.

Was in dieser gerechten Erklärung geschrieben steht, ist

A publisher that emits an output to each subscriber just once, and then finishes.

Aus diesem Satz können Sie das sehen:

Denken Sie gewaltsam daran, dass es sich um einen Herausgeber handelt, der einen Wert ausgibt.

Über Waschbecken

Mit dem im Beispiel angegebenen Code


publisher.sink{ added in
    print(added)
}

Dort war.

Schauen Sie sich die Erklärung dieser [Senke] an (https://developer.apple.com/documentation/combine/publisher/sink(receivevalue :)),

Attaches a subscriber with closure-based behavior to a publisher that never fails.

Die Bedeutung ist unbekannt, aber es scheint, dass sie einen Abonnenten anhängt, also lasst es uns verwenden.

Beispiel 1

Was passiert, wenn Sie think with Just früher anrufen?

Just(1).sink { r in
    print(r)
}

Dies zeigt "1" an.

Es scheint, dass der Herausgeber (Just) 1 nur einmal ausgibt, und wenn er sinkt, wird er in r eingegeben, sodass "1" angezeigt wird.

Beispiel 2

Versuchen wir auch "CurrentValueSubject <Int, Never> (3)", das wir noch nicht besprochen haben.

CurrentValueSubject<Int, Never>(3).sink { r in
    print(r)
}

Dies wird 3 ausgeben!

Was ist der Unterschied zu Just ...

Informationen zu CurrentValueSubject

Was ist CurrentValueSubject? Schauen wir uns die Definition an.


@available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *)
final public class CurrentValueSubject<Output, Failure> : Subject

Dieser Typ scheint ** Betreff ** zu sein. Es war kein Verlag! Es ist auch dasselbe wie "Nur", dass es nur unter iOS 13.0 oder höher verwendet werden kann.

Beschreibung

A subject that wraps a single value and publishes a new element whenever the value changes.

Kann nicht nur Publisher veröffentlichen? Ich werde auch die Definition des Subjekts sehen.

public protocol Subject : AnyObject, Publisher

Anscheinend scheint Subject eine Art Verlag zu sein.

Im Vergleich zu Just

Just Ein Ausgangjedoch(just)Einmal ausgebenPublisher
CurrentValueSubject Wickeln Sie einen Wert ein, um einen neuen Wert zu erhalten, wenn sich der Wert ändertPublishMachenSubject

Der Unterschied zu Just besteht darin, dass bei einer Änderung des Werts der neue Wert veröffentlicht wird! Lass es uns versuchen.


import Combine

let a = CurrentValueSubject<Int, Never>(3)

a.sink{ added in
    print(added)
}

a.value = 100
a.value = 10000
a.send(9999)

Was wird wahrscheinlich ausgegeben? Die Antwort ist

3
100
10000
9999

Es wird jedes Mal gedruckt, wenn ein Wert geändert wird. Außerdem scheint a.send () in der Lage zu sein, die Wertänderung auszudrücken.

Letzte Linie!

Der größte Teil des ersten Beispiels wurde erklärt.

import Combine

let a = CurrentValueSubject<Int, Never>(3)
let b = Just(1)

let publisher = b.combineLatest(a).map{b,a in a + b}

publisher.sink{ added in
    print(added)
}
a.send(10)

Wenn Sie danach wissen, dass "let publisher = b.combineLatest (a) .map {b, a in a + b}" ist, können Sie anscheinend die Bedeutung des Codes verstehen.

combineLatest

Lassen Sie uns zunächst auf "b.combineLatest (a)" achten.

Was bedeutet das?


let a = CurrentValueSubject<Int, Never>(3)
let b = Just(1)

Also sind sowohl a als auch b Verleger.

Schauen wir uns die Beschreibung von [combinLatest] an (https://developer.apple.com/documentation/combine/just/combinelatest (_ :)).

Subscribes to an additional publisher and publishes a tuple upon receiving output from either publisher.

Dieser Typ scheint sowohl Abonnieren als auch Veröffentlichen zu sein.

Eigentlich verwenden

Versuche es zu bewegen.

import Combine

let a = CurrentValueSubject<Int, Never>(3)
let b = Just(1)

let publisher = b.combineLatest(a).sink{r in
    print(r)
}

Was wird damit passieren?

Die richtige Antwort ist

(1, 3)

Apropos, kombinierenLatest sagte früher, dass es ein Tupel zurückgeben würde.

Lassen Sie uns den Wert von a ändern. Fügen Sie 3 Codezeilen hinzu.

import Combine

let a = CurrentValueSubject<Int, Never>(3)
let b = Just(1)

let publisher = b.combineLatest(a).sink{r in
    print(r)
}

a.value = 4
a.value = 5
a.send(6)

Was ist los?

Die richtige Antwort ist

(1, 3)
(1, 4)
(1, 5)
(1, 6)

Der Wert von b bleibt unverändert und wird durch Ändern des Werts von a gedruckt.

Hast du die Bewegung gesehen?

Wer ist combinLatest, der abonniert und veröffentlicht?

Betrachtet man die Definition,


    public func combineLatest<P>(_ other: P) -> Publishers.CombineLatest<Self, P> where P : Publisher, Self.Failure == P.Failure

Es ist lang und unklar, aber es gibt "Publishers.CombineLatest <Self, P>" zurück.

Publishers.CombineLatest


public struct CombineLatest<A, B> : Publisher

Es ist ** Verlag **.

"B.combineLatest (a)" ist also eine Funktion, die zwei Publisher zu einem Publisher macht.

map

Karte ist

Transforms all elements from the upstream publisher with a provided closure.

Es scheint, dass sich alles verändern wird.

Betrachtet man die Definition

public func map<T>(_ transform: @escaping (Self.Output) -> T) -> Publishers.Map<Self, T>

Immerhin gibt dies immer Publisher zurück!

Beispiel 1

Das Beispiel in "combinLatest".

import Combine

let a = CurrentValueSubject<Int, Never>(3)
let b = Just(1)

let publisher = b.combineLatest(a).sink{r in
    print(r)
}

a.value = 4
a.value = 5
a.send(6)

Ergebnis ist,

(1, 3)
(1, 4)
(1, 5)
(1, 6)

Es war.

Versuchen Sie, nach combinLatest in diesem Code eine Karte hinzuzufügen.


import Combine

let a = CurrentValueSubject<Int, Never>(3)
let b = Just(1)

let publisher = b.combineLatest(a)
    .map{(b,a) in a+b}
    .sink{r in print(r)}

a.value = 4
a.value = 5
a.send(6)

Was wird wahrscheinlich zurückkehren?

Die richtige Antwort ist

4
5
6
7

das ist

(1, 3)
(1, 4)
(1, 5)
(1, 6)

Sie können sehen, dass jedes dieser Ergebnisse zwei Werte hinzufügt.

Beispiel 2

Ich habe .map {(b, a) in a + b} in .map {(b, a) in a} geändert. Was wird die Ausgabe sein?


import Combine

let a = CurrentValueSubject<Int, Never>(3)
let b = Just(1)

let publisher = b.combineLatest(a)
    .map{(b,a) in a}
    .sink{r in print(r)}

a.value = 4
a.value = 5
a.send(6)

Die richtige Antwort ist

3
4
5
6

Zusammenfassung

Kombinieren iOS 13.Über 0import Combine
Was ist gerecht? Geben Sie den Wert nur einmal ausPublisher
Was ist Waschbecken? Abonnieren Sie den von Publisher ausgegebenen Wert(Subscribe)Kann verarbeitet werden
CurrentValueSubject Der Wert kann geändert werden und der geänderte Wert wird ausgegeben.Publisher(Subject)
Wie ändere ich den Wert von CurrentValueSubject? CurrentValueSubject.Zuweisen zu Wert oder CurrentValueSubject.send(value)Geben Sie einen Wert in ein
Was ist combinLatest Macht zwei Verlage zu einem Verlag und gibt den Wert als Taple zurück.
Was ist Karte Transformieren Sie alle Werte vom Herausgeber

Haben Sie das Verhalten des Codes unterhalb des Ziels verstanden?

import Combine

let a = CurrentValueSubject<Int, Never>(3)
let b = Just(1)

let publisher = b.combineLatest(a).map{b,a in a + b}

publisher.sink{ added in
    print(added)
}
a.send(10)

Recommended Posts

Schneller Mähdrescher Erster Schritt
JAVA (Erster Schritt: Git Bush Edition)