Section 3/171 menit

3. Teori: Mental Model untuk Berpikir Konkuren

3. Teori: Mental Model untuk Berpikir Konkuren

Tiga Pertanyaan Sebelum Menulis Kode Async

Setiap kali kamu akan menambah async / actor / @MainActor, tanyakan:

  1. Siapa yang punya state ini? Kalau state mutable diakses dari banyak tempat, dia butuh isolation domain.
  2. Apa yang terjadi setelah await? Setiap await adalah suspension point — bisa diinterleave, bisa di-cancel, invariant bisa pecah.
  3. Apakah ini perlu paralel, atau cukup async? Async ≠ parallel. Banyak operasi async tetap sequential semantically; mereka cuma tidak memblock thread.

Tiga Lapisan Isolation di Aplikasi

Aplikasi sehat biasanya terdiri dari tiga lapisan isolation:

Lapisan Isolation Tujuan
UI @MainActor View, ViewModel, navigation
Domain actor instance / custom global actor Use case, repository, service
Data actor instance / @ModelActor (SwiftData) Cache, database, network

Aliran data:

swift
View (MainActor)
    await
ViewModel (MainActor)
    await
Service (Domain actor)
    await
Repository (Data actor)

Aturan emas: UI tidak langsung panggil Data. Selalu lewat Domain.

Async Bukan Tentang Threading

Banyak developer pikir async = "jalankan di background thread". Salah. async artinya: fungsi ini bisa menunggu sesuatu tanpa memblock thread caller.

swift
@MainActor
func fetchAndUpdate() async {
    // Ini async, tapi tetap di main thread sepanjang waktu
    // (kalau semua callee juga @MainActor)
    let data = try? await self.localStore.read()  // main thread
    self.label.text = data?.title  // main thread
}

Untuk pindah ke background thread, butuh hop ke isolation lain (actor instance, global actor non-main, atau Task.detached).