Für diejenigen, die Swift noch nicht kennen und ein Gefühl für Combine bekommen möchten. Hier ist ein einfacher Code.
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".
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.
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 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.
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.
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.
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 ...
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.
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.
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.
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?
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!
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.
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
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)