Section 15/201 menit
15. Default Actor Isolation per Module
15. Default Actor Isolation per Module
Teori: Module-Wide Default Isolation
Salah satu friction terbesar saat bermigrasi ke Swift 6 adalah keharusan menambahkan @MainActor ke setiap ViewController, ViewModel, dan View. Di aplikasi besar dengan ratusan file, ini adalah pekerjaan yang sangat repetitif.
Swift 6.2 memperkenalkan kemampuan untuk set default isolation seluruh module:
swift
// Package.swift — set default isolation untuk target
.target(
name: "UILayer",
swiftSettings: [
.swiftLanguageVersion(.v6),
.defaultIsolation(MainActor.self) // semua kode di module ini: @MainActor by default
]
)
swift
// UILayer/HomeViewController.swift
// TANPA annotation eksplisit — sudah @MainActor karena module default
class HomeViewController: UIViewController {
var viewModel: HomeViewModel // @MainActor — inherited from module default
var isLoading = false // @MainActor
func loadData() async {
isLoading = true
let data = await viewModel.fetchData() // hop ke viewModel isolation
displayData(data)
isLoading = false
}
}
// Untuk fungsi yang memang butuh background — eksplisit opt-out:
nonisolated func heavyComputation(data: Data) -> Result {
// berjalan tanpa isolation — background thread
}
Dampak dan Trade-off
swift
Module UILayer (default: @MainActor)
├── HomeViewController → @MainActor (automatic)
├── HomeViewModel → @MainActor (automatic)
├── UserCell → @MainActor (automatic)
└── heavyComputation() → nonisolated (explicit opt-out)
Module Core (no default isolation)
├── UserRepository → actor (explicit)
├── NetworkClient → actor (explicit)
└── DataParser → nonisolated (default, no annotation)
Kapan gunakan default isolation:
- UI layer (ViewController, View, ViewModel)
- Module yang predominantly main-thread
- Migrasi: mengurangi jumlah annotation yang perlu ditambahkan
Jangan gunakan untuk:
- Module bisnis logic atau data layer — akan "accidentally" main thread
- Library dengan mixed isolation needs
- Module yang di-share antara UI dan background processing