안녕하세요! 피피아노입니다 🎵
이번 포스팅에서는 저번 포스팅에 이어서 Actor에 대해서 마저 정리해보도록 하겠습니다.
혹시 지난번 포스팅이 궁금하신 분들은 여기를 참고해주세요!
그럼 바로 시작합니다!
MainActor란?
MainActor는 Swift에서 UI 업데이트와 같은 작업을 메인 스레드에서 실행하도록 보장하는 특수한 Actor입니다.
Swift에서는 메인 스레드는 메인 액터(Main Actor)로 표현합니다. 다른 말로는 전역 액터(goabal actor)라고도 표현을 하는데 전역이라는 말에서 알 수 있듯이 메인 스레드에서 실행해야 할 코드를 프로그램 코드 전체에서 접근할 수 있기 때문입니다.
앱을 개발하다 보면 메인 액터에서 실행해야 하는 코드들이 있을 수 있습니다. 특히 UI를 업데이트 해야 하는 경우 유독 그런 일들이 생기는데 그럴 때 @MainActor를 사용하면 됩니다.
왜 MainActor일까?
MainActor의 개념을 알았다면 왜 MainActor를 써야 하는지 의문이 생길 수 있습니다. 그 이유는 크게 2가지 정도로 정리할 수 있습니다.
1. UI 업데이트의 안전성 확보
UI와 관련된 작업은 항상 메인 스레드에서 이루어져야 합니다. 그렇지 않으면 경쟁 상태(race condition)나 예기치 않은 동작으로 앱이 제대로 동작하지 않을 수 있습니다.
2. 명확하고 가독성 높은 코드
과거에는 메인 스레드에서 코드를 실행하려면 DispatchQueue.main.async를 명시적으로 호출해야 했습니다. 하지만 MainActor가 등장하고 나서는 메인 스레드로 전환하는 작업을 자동화할 수 있어서 코드가 더 간결해지고 이 코드가 UI와 관련된 작업임을 쉽게 알 수 있게 되었습니다.
DispatchQueue.main.async {
// 이전 방식: 명시적으로 메인 스레드 지정
self.updateUI()
}
@MainActor
func updateUI() {
// MainActor로 자동 메인 스레드 처리
label.text = "Hello, MainActor!"
}
MainActor 사용법
1. 함수에서 @MainActor 사용
MainActor는 위에서 잠깐 언급했다시피, 함수에 @MainActor를 선언하면 해당 함수가 항상 메인 스레드에서 실행됩니다.
@MainActor
func updateUI() {
print("이 함수는 항상 메인 스레드에서 실행됩니다.")
label.text = "MainActor를 사용한 UI 업데이트"
}
2. 클래스/구조체 전체에 @MainActor 적용
클래스나 구조체 전체에 @MainActor를 선언하면, 모든 메서드와 프로퍼티가 메인 스레드에서 실행됩니다.
@MainActor
class ViewModel {
var message: String = "MainActor 적용 중"
func updateMessage(_ newMessage: String) {
message = newMessage
}
}
3. MainActor를 사용한 비동기 함수 호출
MainActor는 동시성과도 통합이 되어 있기 때문에 async 함수에서도 안전하게 UI를 업데이트 할 수 있습니다.
@MainActor
func fetchAndDisplayData() async {
let data = await fetchData()
label.text = data
}
주의할 점
MainActor를 사용하면 주의해야 할 점들이 존재하는데 MainActor는 UI 작업에 집중해야 한다는 점입니다.
MainActor는 메인 스레드에서 실행되므로, CPU 집약적인 작업이나 시간이 오래 걸리는 작업을 피해야 하는데, 이런 작업은 별도의 백그라운드 스레드에서 처리해야 합니다.
그리고 여러 Actor를 사용해야 하는 경우, await 키워드를 사용해서 안전하게 Actor 간 상호작용을 해야 합니다.
오늘은 여기까지 :)
감사합니다.
잘못된 내용이 있거나 더 좋은 내용 피드백은 언제나 환영합니다!
궁금하신 부분은 댓글로 질문 부탁드립니다!
'Apple > Swift' 카테고리의 다른 글
[Swift] 두 정수 사이의 합 (4) | 2024.12.05 |
---|---|
[Swift] 삼총사 문제 풀이 및 회고 (6) | 2024.11.30 |
[Swift] stride와 enumerated 알아보기 (2) | 2024.11.24 |
[Swift] 과일 장수 문제 풀이 및 회고 (4) | 2024.11.20 |
[Swift] 제곱근 판별하기 (5) | 2024.11.16 |