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를 나누는 게 좋아용
이것도 있긴 한데 나중에 친숙해지면 다루는 걸로