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)
├── UserRepositoryactor (explicit)
├── NetworkClientactor (explicit)
└── DataParsernonisolated (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