17. Ringkasan & Decision Guide
17. Ringkasan & Decision Guide
Quick Reference Decision Table
| Pertanyaan | Pilihan |
|---|---|
| Apa isolation default untuk ViewModel? | @MainActor |
| Apa isolation default untuk Service / Repository? | actor instance |
| Apa default untuk Model (User, Order, dsb)? | struct: Sendable |
| Untuk shared singleton resource (DB pool, logger)? | Custom @globalActor |
| Bagaimana share mutable state? | Actor (bukan class + lock) |
| Bagaimana paralelkan N task? | async let (≤3) atau TaskGroup (banyak) |
| Bagaimana debounce di SwiftUI? | Task.sleep + cancel-before-replace |
| Bagaimana cancel task saat caller di-cancel? | Structured concurrency (jangan detached) |
| Bagaimana update UI dari background task? | Hop ke @MainActor via await self.foo = ... |
| Bagaimana tes actor? | TaskGroup stress test + functional assertion |
| Bagaimana migrasi project lama? | Phase 1 warning → 2 triage → 3 refactor → 4 strict CI |
Checklist Code Review
- Setiap ViewModel
@MainActor? - CPU-heavy work di luar
@MainActor? - Setiap mutable shared state di
actor? - Tipe model public di-mark
Sendable? -
@unchecked Sendablepunya synchronization yang dapat di-audit? - Long-running Task disimpan referensinya & dibersihkan di deinit?
-
[weak self]di closure Task yang lifecycle-nya panjang? -
Task.isCancelled/Task.checkCancellation()di loop panjang? -
CancellationErrorditangani terpisah dari error production? - Tidak ada
awaitsaat memegang lock manual? - Tidak ada
Task { }di init untuk async setup? -
MainActor.rundigantiMainActor.assumeIsolatedkalau callback dijamin di main? - Batch UI update (satu hop, bukan banyak)?
- Strict Concurrency Checking aktif di build settings?
Anti-Pattern Hit List
@MainActordi model domain.@unchecked Sendabletanpa lock.Task { }tanpa simpan ref atau structured.Task.detachedsaat sebenarnya butuh structured.- Capture strong
selfdi long-running Task. awaitsaat memegang lock manual.Task.sleepsebagai wait di test.DispatchQueue.main.asyncdi code Swift Concurrency baru.- CPU-heavy di
@MainActor. - Async function tanpa
awaitdi body.
Apa yang Harus Dipelajari Selanjutnya
swift-actor-sendable-deep-dive.md— internal mechanics actor, executor, hop cost.swift-isolation-swift6.md— referensi isolation domain dan migration guide.swift-async-algorithms.md— operator pipeline untuk AsyncSequence yang sering berinteraksi dengan isolation.swift6-synchronization.md—Mutex/Atomicuntuk low-level synchronization saat actor terlalu mahal.
Penutup
Best practice ini bukan aturan baku — mereka adalah default yang masuk akal. Konteks bisa membatalkan: ada kalanya kamu perlu @unchecked Sendable (saat membungkus C API), perlu Task.detached (saat lifecycle benar-benar lepas), perlu memaksa CPU-heavy di main thread (saat ukuran data sangat kecil dan overhead hop lebih mahal).
Yang penting: tahu kenapa kamu menyimpang. Setiap deviasi dari default ini harus bisa dijawab pertanyaan "kenapa tidak pakai default?". Kalau jawabannya "tidak tahu", kembali ke default. Kalau jawabannya konkret dan teruji, deviasi itu valid — dan dokumentasikan dalam komentar singkat.
Mulai dari prinsip dasar di Bagian 4, terapkan checklist code review di Bagian 17, dan migrasi project secara bertahap dengan strict concurrency checking. Bug konkurensi yang paling murah adalah yang ter-tangkap compiler.