actor CurrentUserManager {
func updateDatabase(userInfo: MyUserInfo) {
}
}
struct MyUserInfo: Sendable {
let name: String
}
class SendableBootcampViewModel: ObservableObject {
let manager = CurrentUserManager()
func updateCurrentUserInfo() async {
let info = MyUserInfo(name: "info")
await manager.updateDatabase(userInfo: info)
}
}
만약에 thread safe해야 되는 코드가 (actor에 있는 메소드)
thread safe하지 않은 객체를 가져다가 쓰고 있다면?
Sendable이라는 프로토콜을 준수해줘야함
Sendable을 준수하려면 class는 final이라는 키워드가 붙어야하고
struct의 경우 let으로 선언하든 var로 선언하든 상관 없는데
class는 Sendable을 채택했을 때 var로 선언한다면 문제가 생김
var로 선언하고 싶다면 @unchecked 를 붙여주면 되긴 한데
위험함
@unchecked는 컴파일러한테 체크하지말라고 하는 거라
직접 queue를 만들어서 async하게 동작하게 만들어줘야한다!
(근데 이건 추천하는 방법은 아님)
그냥 값타입일 때 쓰세요
(Sendable을 붙여주지 않더라도 Sendable하지만 약간의 메모리 benefit이 있습니다~)