[Swift Concurrency] AsyncPublisher

Woozoo·2023년 5월 6일
0

[Swift Concurrency]

목록 보기
13/13
actor AsyncPublisherDataManager {
    @Published var myData: [String] = []
    
    func addData() async {
        myData.append("Apple")
        try? await Task.sleep(nanoseconds: 2_000_000_000)
        myData.append("Banana")
        try? await Task.sleep(nanoseconds: 2_000_000_000)
        myData.append("Orange")
        try? await Task.sleep(nanoseconds: 2_000_000_000)
        myData.append("Watermelon")
    }
}


class AsyncPublisherBootcampViewModel: ObservableObject {
    @Published var dataArray: [String] = []
    let manager = AsyncPublisherDataManager()
    
    func start() async {
        await manager.addData()
    }
}

struct AsyncPublisherBootcamp: View {
    @StateObject private var viewModel = AsyncPublisherBootcampViewModel()
    
    var body: some View {
        ScrollView {
            VStack {
                ForEach(viewModel.dataArray, id: \.self) {
                    Text($0)
                        .font(.headline)
                }
            }
        }
        .task {
            await viewModel.start()
        }
    }
}

요렇게 있다고 해보자

combine을 우선 먼저 사용해볼거

이걸 async로 처리할라면 어떻게 해야할까?

이렇게 바꿔주면 됨

그리고 MainActor가 되게 해주고!

for await은 값이 도착할 때까지 기다려서
지금처럼 코드가 작성되면 아래의 Two는 실행이 안되는 걸 볼 수 있음 (따로 break를 작성하거나 해야함)

그래서 Mutiple publisher를 만들고 싶으면 Task를 나누는 게 좋아용


이것도 있긴 한데 나중에 친숙해지면 다루는 걸로

profile
우주형

0개의 댓글