Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Swift Concurrency - 状態監視の罠

Swift Concurrency - 状態監視の罠

extension DC 2025 Day1

Avatar for Yuki Yasoshima

Yuki Yasoshima

October 01, 2025
Tweet

More Decks by Yuki Yasoshima

Other Decks in Programming

Transcript

  1. "TZOD4USFBNͰͷ௨஌ͷ࣮૷ྫ let (stream, continuation) = AsyncStream<Int>.makeStream() Task { for await

    value in stream { // ஋ͷड৴ print("\(value)") } } continuation.yield(value) // ஋ͷૹ৴ task?.cancel() // TaskΛΩϟϯηϧͯ͠؂ࢹΛऴྃ continuation.finish() // ΋͘͠͸streamଆͰऴྃ
  2. ௨஌ͷड৴ͷ࣮ߦॱ $PNCJOFͷ৔߹ let subject = PassthroughSubject<Int, Never>() let cancellable =

    subject.sink { value in // 2ɺ୯ʹsink͚ͩͳΒಉظతʹ࣮ߦ͞ΕΔ print("value: \(value)") } // 1 subject.send(1) // 3
  3. ௨஌ͷड৴ͷ࣮ߦॱ Task { for await value in stream { //

    3ɺawaitͳͷͰඞͣૹ৴ଆͱ͸෼཭ͨ͠ॲཧʹͳΔ print("value: \(value)") } } // 1 continuation.yield(value) // 2 Suspention Point͕ೖΔ·Ͱͷॲཧ "TZOD4FRVFODF
  4. /PUJ fi DBUJPO$FOUFS ։࢝ͷλΠϛϯάʢ5BTLͷதʣ let nc = NotificationCenter.default // Task͸͍࣮ͭߦ͞ΕΔ͔Θ͔Βͳ͍

    Task { let notifications = nc.notifications(named: .init("SampleName")) for await _ in notifications { print("notified") } } // ͜ͷλΠϛϯάͷ௨஌͸ड͚औΕͳ͍ nc.post(name: .init("SampleName"), object: nil)
  5. /PUJ fi DBUJPO$FOUFS ։࢝ͷλΠϛϯάʢ5BTLͷલʣ let nc = NotificationCenter.default // ઌʹAsyncSequenceΛऔಘ͢Δ

    let notifications = nc.notifications(named: .init(“SampleName")) Task { for await _ in notifications { print("notified") } } // ͜ͷλΠϛϯάͷ௨஌͕ड͚औΕΔʢ਺ݸͳΒʣ nc.post(name: .init("SampleName"), object: nil)
  6. /PUJ fi DBUJPO$FOUFSͷόοϑΝ ҰؾʹQPTU͢Δ let nc = NotificationCenter.default let notifications

    = nc.default .notifications(named: .init("SampleName2")) .compactMap { $0.object as? Int } Task { for await value in notifications { print(“\(value)”) // ࣮ߦ݁Ռͷྫɿ0,3,4,5,6,7,8,9 } } // ҰؾʹૹΔͱऔΓ͜΅͢ for value in 0..<10 { nc.post(name: .init("SampleName2"), object: value) }
  7. 1BTTUISPVHI4VCKFDU શ͘ड৴Ͱ͖ͳ͍ύλʔϯ let subject = PassthroughSubject<Int, Never>() let values =

    subject.values Task { for await value in values { print(“\(value)") // ࣮ߦ݁Ռͷྫɿͳ͠ } } subject.send(0) // ड͚औΕͳ͍ Task { for value in 1..<10 { subject.send(value) // ड͚औΕͳ͍͔΋ } }
  8. 1BTTUISPVHI4VCKFDU ZJFMEΛೖΕͯૹ৴ let subject = PassthroughSubject<Int, Never>() let values =

    subject.values Task { for await value in values { print(“\(value)") // ࣮ߦ݁Ռͷྫɿ1,3,5,6,8 } } subject.send(0) // ड͚औΕͳ͍ Task { for value in 1..<10 { subject.send(value) await Task.yield() // yieldೖΕͯ΋औΓ͜΅͢Մೳੑ͋Γ } }
  9. 1BTTUISPVHI4VCKFDU CV ff FSΛೖΕΔ let subject = PassthroughSubject<Int, Never>() let

    values = subject.buffer(size: 5, prefetch: .byRequest, whenFull: .dropOldest).values Task { for await value in values { print(“\(value)") // ࣮ߦ݁Ռͷྫɿ1,2,3,4 } } subject.send(0) // มΘΒͣड͚औΕͳ͍ Task { for value in 1..<5 { subject.send(value) // όοϑΝͷαΠζҎԼͳΒड͚औΕΔ } }
  10. 1BTTUISPVHI4VCKFDU JUFSBUPSΛઌʹऔಘ͢Δ let subject = PassthroughSubject<Int, Never>() let values =

    subject.buffer(size: 5, prefetch: .byRequest, whenFull: .dropOldest).values var iterator = values.makeAsyncIterator() Task { while let value = await iterator.next() { print(“\(value)") // ࣮ߦ݁Ռͷྫɿ0,1,2,3,4 } } subject.send(0) // ͜͜΋ड͚औΕΔ Task { for value in 1..<5 { subject.send(value) // όοϑΝͷαΠζҎԼͳΒड͚औΕΔ } }
  11. $VSSFOU7BMVF4VCKFDU ࠷৽ͷ஋͸ड৴Ͱ͖Δ let subject = CurrentValueSubject<Int, Never>(0) let values =

    subject.values Task { for await value in values { print(“\(value)") // ࣮ߦ݁Ռͷྫɿ9 } } // ҰؾʹૹΔͱɺ్த͸औΓ͜΅͢ for value in 0..<10 { subject.value = value }
  12. "TZOD4USFBNͷόοϑΝ public init( _ elementType: Element.Type = Element.self, bufferingPolicy limit:

    AsyncStream<Element>.Continuation.BufferingPolicy = .unbounded, _ build: (AsyncStream<Element>.Continuation) -> Void ) AsyncStream<Int>.makeStream(bufferingPolicy: .unbounded) // ແ੍ݶɻσϑΥϧτͱಉ͡ AsyncStream<Int>.makeStream(bufferingPolicy: .bufferingNewest(10)) // ৽͍͠΋ͷΛ࢒͢ AsyncStream<Int>.makeStream(bufferingPolicy: .bufferingOldest(10)) // ݹ͍΋ͷΛ࢒͢
  13. Ͳ͏͢Δ͔ʁ w ஋ͷ؂ࢹʢ్தܦաΛऔΓ͜΅ͯ͠΋໰୊ͳ͍ͳΒʣ w $VSSFOU7BMVF4VCKFDUͷWBMVFT͸͋Γ w J04Ҏ্ͳΒ0CTFSWBUJPOT΋࢖͑Δ w ௨஌ܥ w

    όοϑΝͷαΠζΛे෼ʹେ͖͘͢Δʁ w چདྷͷ࢓૊Έͱ"TZOD4USFBNΛ૊Έ߹ΘͤΔͱ͔ʁ w ແཧʹ"TZOD4FRVFODFΛ࢖Θͳͯ͘΋ྑ͍ͷͰ͸ʁ
  14. 4XJGUͰͷΫϥογϡ Ϋϩʔδϟͷݺͼग़͠ @MainActor final class CrashSample { let subject =

    CurrentValueSubject<Int, Never>(0) let cancellable: AnyCancellable init() { cancellable = subject .receive(on: DispatchQueue.global()) .sink { /* @MainActor */ _ in // @MainActorͷΫϩʔδϟΛBGεϨου͔ΒݺͿͱSwift6Ͱ͸Ϋϥογϡ͢Δ } } } // ※ ྫͱͯ͠CombineΛ࢖͍ͬͯΔ͕ɺAVAudioEngineͳͲଞͷAPIͰ΋ى͖Δ