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.