iOS/설명

[iOS] Actor

Sky Titan 2025. 11. 8. 13:54
728x90

https://developer.apple.com/documentation/swift/actor/

 

Actor | Apple Developer Documentation

Common protocol to which all actors conform.

developer.apple.com

 

Actor

  • 동시성 환경에서 Data Race를 방지하기 위해 도입된 Swift의 type중 하나
  • Swift 5.5 (iOS 15, macOS 12)부터 도입된 Concurrency Model의 핵심 요소 중 하나
  • 클래스와 비슷하지만 동시에 여러 스레드에서 접근해도 안전하게 상태를 관리하게 해준다.
  • 자신의 내부 상태를 한 번에 하나의 Task만 접근할 수 있게 보호하는 일종의 동시성 격리 공간(isolation zone)

 

Actor 규칙

  • 내부에서 접근 시엔 동기적으로 접근 가능
  • 외부에서 await로 접근
  • 동기 메서드는 외부에서 호출 불가능
    • 메서드가 sync라도 외부에서 호출 시엔 무조건 await 필요
actor MyActor {
    var counter: Int = 0
    
    func increment() {
        // 내부에서 접근 시엔 동기적으로 접근 가능
        counter += 1
    }
}

let actor = MyActor()

let value = await actor.counter // 외부에서 접근 시엔 무조건 await로 접근
await actor.increment()

 

Non-isolated (격리 해제) 예외

만약 특정 메서드가 동시성 안전성을 해치지 않는다면,
nonisolated 키워드로 “이건 Actor 외부에서도 await 없이 접근 가능하다”고 명시할 수 있다.

actor MyActor {
    var counter: Int = 0
    
    func increment() {
        counter += 1 // No error
    }
    
    nonisolated func someFunction() {
        print("it is actor") // No error
        counter += 1 // Error : Actor-isolated property 'counter' can not be mutated from a nonisolated context
    }
}

let actor = MyActor()
actor.someFunction() // Async 없이 호출가능

실제 사용 패턴

  • 공유 상태(state)를 여러 Task가 접근하는 경우
  • 네트워크 요청, 캐싱, 데이터베이스 같은 “공유 리소스 관리자”를 구현할 때
  • SwiftUI의 ViewModel 같은 구조에서, 데이터 일관성을 지킬 때

Class vs Actor

구분 class actor
동시성 안전성 ❌ 직접 보장해야 함 ✅ 자동 보장
접근 방식 즉시 await 필요 (비동기적)
참조 타입
상속 ❌ (단, Actor 프로토콜 채택 가능)
내부 격리

 

728x90