Last active
June 9, 2020 17:15
-
-
Save ryotapoi/38d4c2ecbe7964389830586c143592d9 to your computer and use it in GitHub Desktop.
CurrentValueSubjectの詳細な動作を確認する
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Combine | |
do { | |
let subject: CurrentValueSubject<Int, Error> = .init(1) | |
subject.send(completion: .finished) | |
// completionしているとsinkで即competionが呼ばれる | |
let cancelable = subject.sink(receiveCompletion: { (completion) in | |
completion | |
return | |
}, receiveValue: { (value) in | |
// completionの後は呼ばれない | |
value | |
return | |
}) | |
} | |
do { | |
let subject: CurrentValueSubject<Int, Error> = .init(1) | |
let cancelable = subject.sink(receiveCompletion: { (completion) in | |
completion | |
return | |
}, receiveValue: { (value) in | |
// 1回だけ実行される | |
// completionの後は呼ばれない | |
value | |
return | |
}) | |
subject.send(completion: .finished) | |
// completionしていてもvalueは取れる | |
subject.value // => 1 | |
subject.send(2) | |
// completionしているとsendは無視される | |
subject.value // => 1 | |
subject.value = 3 | |
// completionしていてもvalueは有効。 | |
// valueはCombine.SubjectではなくCurrentValueSubjectの機能だから? | |
subject.value // => 3 | |
} | |
do { | |
let subject1: CurrentValueSubject<Int, Error> = .init(1) | |
let subject2: CurrentValueSubject<Int, Error> = .init(100) | |
subject1.value // => 1 | |
subject2.value // => 100 | |
let cancelable = subject1.subscribe(subject2) | |
// currentValueSubjectはsubscribeした瞬間現在の値が流れるので、subject1,2は同じ値になる | |
subject1.value // => 1 | |
subject2.value // => 1 | |
subject1.send(2) | |
// 上流であるsubject1に値を流すとsubject2に値が流れる | |
subject1.value // => 2 | |
subject2.value // => 2 | |
subject2.send(200) | |
// 下流であるsubject2に値を流してもsubject1には影響しない | |
subject1.value // => 2 | |
subject2.value // => 200 | |
} | |
do { | |
let subject1: CurrentValueSubject<Int, Error> = .init(1) | |
let subject2: CurrentValueSubject<Int, Error> = .init(100) | |
let cancelable = subject1.subscribe(subject2) | |
subject1.value // => 1 | |
subject2.value // => 1 | |
cancelable.cancel() | |
subject1.send(2) | |
// cancelすればsubject1からsubject2に値は流れなくなる | |
subject1.value // => 2 | |
subject2.value // => 1 | |
} | |
do { | |
let subject1: CurrentValueSubject<Int, Error> = .init(1) | |
let subject2: CurrentValueSubject<Int, Error> = .init(100) | |
let cancelable = subject1.subscribe(subject2) | |
subject1.value // => 1 | |
subject2.value // => 1 | |
subject1.send(completion: .finished) | |
// subject1を完了するとsubject2も完了する | |
// subject2へのsendが無効になる | |
subject2.send(200) | |
subject1.value // => 1 | |
subject2.value // => 1 | |
} | |
do { | |
let subject1: CurrentValueSubject<Int, Error> = .init(1) | |
let subject2: CurrentValueSubject<Int, Error> = .init(100) | |
let cancelable = subject1.subscribe(subject2) | |
subject1.value // => 1 | |
subject2.value // => 1 | |
cancelable.cancel() | |
subject1.send(completion: .finished) | |
// cancelすればcompletionの流れない | |
subject2.send(200) | |
subject1.value // => 1 | |
subject2.value // => 200 | |
} | |
do { | |
let subject1: CurrentValueSubject<Int, Error> = .init(1) | |
let subject2: CurrentValueSubject<Int, Error> = .init(100) | |
let cancellable = subject1.subscribe(subject2) | |
subject1.value // => 1 | |
subject2.value // => 1 | |
subject2.send(completion: .finished) | |
subject1.send(2) | |
// subject2が完了しているので、subject1からsubject2に値を流す設定でもsubject2には影響しない | |
subject1.value // => 2 | |
subject2.value // => 1 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment