Section 1/211 menit
1. Gambaran Arsitektur VIP + Isolation
1. Gambaran Arsitektur VIP + Isolation
Diagram Alur
swift
┌─────────────────────────────────────────────────────────────────┐
│ @MainActor │
│ ┌────────────────────┐ ┌───────────────────────────┐ │
│ │ ViewController │───────▶│ Router │ │
│ │ (UIKit / UI only) │ │ (push/present/dismiss) │ │
│ └────────┬───────────┘ └───────────────────────────┘ │
│ │ displayUsers() ▲ │
│ │ displayError() │ routeToDetail() │
└───────────┼───────────────────────────────┼─────────────────────┘
│ await fetchUsers() │
▼ │
┌─────────────────────────────────────────┐│
│ actor ││
│ Interactor ││
│ (business logic, state) ││
│ ││
│ uses: Worker (actor) ││
└─────────────────────────────────────────┘│
│ await presenter.presentUsers(response)
▼
┌─────────────────────────────────────────┐
│ @MainActor │
│ Presenter │
│ (format data, tidak ada UIKit) │
│ │
│ calls: viewController.displayUsers() │
└─────────────────────────────────────────┘
Pembagian Isolation
| Komponen | Isolation | Alasan |
|---|---|---|
ViewController |
@MainActor |
Semua UIKit harus di main thread |
Presenter |
@MainActor |
Memanggil ViewController yang @MainActor |
Interactor |
actor |
Punya mutable state (loading flag, cache) |
Worker |
actor |
Network/data access yang thread-safe |
Router |
@MainActor |
Navigation pakai UIKit |
| Models (Request/Response/ViewModel) | Sendable struct |
Harus melewati isolation boundary |
Mengapa Bukan Semua @MainActor?
Menaruh semua layer di @MainActor memang mudah, tapi memblokir main thread untuk pekerjaan berat seperti parsing JSON, query database, atau transformasi data. Dengan actor di Interactor dan Worker, pekerjaan tersebut berjalan di background — main thread tetap responsif untuk animasi dan gesture.