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:
- Siapa yang punya state ini? Kalau state mutable diakses dari banyak tempat, dia butuh isolation domain.
- Apa yang terjadi setelah
await? Setiapawaitadalah suspension point — bisa diinterleave, bisa di-cancel, invariant bisa pecah. - 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).