Skip to content

Instantly share code, notes, and snippets.

@ryotapoi
Last active June 9, 2020 17:15
Show Gist options
  • Save ryotapoi/38d4c2ecbe7964389830586c143592d9 to your computer and use it in GitHub Desktop.
Save ryotapoi/38d4c2ecbe7964389830586c143592d9 to your computer and use it in GitHub Desktop.
CurrentValueSubjectの詳細な動作を確認する
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