[Swift Concurrency] @globalActor

Woozoo·2023년 5월 6일
0

[Swift Concurrency]

목록 보기
11/13
actor MyNewDataManager {
    
    func getDataFromDatabase() -> [String] {
        return ["One", "Two", "Three"]
    }
    
}

class GlobalActorBootcampViewModel: ObservableObject {
    
    @Published var dataArray: [String] = []
    let manager = MyNewDataManager()
    
    func getData() async {
        let data = await manager.getDataFromDatabase()
        self.dataArray = data
    }
    
}

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

이렇게 actor, class, view가 있다고 해봅시다


global Actor를 알아볼건데 이게 뭘까?


global Actor를 만들려면 shared 인스턴스가 필요함



globalActor는 약간 isolated랑 비슷함
async가 아닌 메소드를 async하게 만들어주는 느낌?


다음은 MainActor에 대해서!

class GlobalActorBootcampViewModel: ObservableObject {
    
    @MainActor @Published var dataArray: [String] = []
    let manager = MyFirstGlobalActor.shared
    
    @MyFirstGlobalActor
    func getData() {
        
        // Heavy Complex Methods
        
        Task {
            let data = await manager.getDataFromDatabase()
            await MainActor.run(body: {
                self.dataArray = data
            })
        }
    }
    
}

actor가 동작하는 게 UI에 업데이트를 하게 되서
main thread에서 동작하는 걸 보장해주는 키워드

profile
우주형

0개의 댓글