Skip to content

Instantly share code, notes, and snippets.

@brownsoo
Created November 30, 2023 00:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save brownsoo/12faaaf35ee8883b8b4e1f0ff1570f00 to your computer and use it in GitHub Desktop.
Save brownsoo/12faaaf35ee8883b8b4e1f0ff1570f00 to your computer and use it in GitHub Desktop.
SwiftUI 예시 : 뷰가 사라지면 Task는 자동 취소
//
// TaskCancelledOnDismissView.swift
// SwiftUITaskWorkout
//
// Created by Paul Hudson.
// https://twostraws.gumroad.com/l/concurrency
//
import SwiftUI
struct TaskCancelledOnDismissView: View {
var body: some View {
NavigationLink(destination: NemberGenerationView()) {
Text("Start Generating Numbers")
}
}
}
struct NemberGenerationView: View {
@State private var numbers = [String]()
let generator = NumberGenerator(in: 1...100)
var body: some View {
List(numbers, id: \.self, rowContent: Text.init)
.task {
print("start generating")
await generateNumbers()
print("done generating")
}
}
func generateNumbers() async {
for await number in generator {
numbers.insert("\(numbers.count + 1). \(number)", at: 0)
}
}
}
// A simple random number generator sequence
struct NumberGenerator: AsyncSequence, AsyncIteratorProtocol {
typealias Element = Int
let delay: Double
let range: ClosedRange<Int>
init(in range: ClosedRange<Int>, delay: Double = 1) {
self.range = range
self.delay = delay
}
mutating func next() async -> Int? {
// Make sure we stop emitting numbers when our task is cancelled
while Task.isCancelled == false {
try? await Task.sleep(nanoseconds: UInt64(delay) * 1_000_000_000)
print("Generating number")
return Int.random(in: range)
}
return nil
}
func makeAsyncIterator() -> NumberGenerator {
self
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment