Section 17/173 menit

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 Sendable punya 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?
  • CancellationError ditangani terpisah dari error production?
  • Tidak ada await saat memegang lock manual?
  • Tidak ada Task { } di init untuk async setup?
  • MainActor.run diganti MainActor.assumeIsolated kalau callback dijamin di main?
  • Batch UI update (satu hop, bukan banyak)?
  • Strict Concurrency Checking aktif di build settings?

Anti-Pattern Hit List

  1. @MainActor di model domain.
  2. @unchecked Sendable tanpa lock.
  3. Task { } tanpa simpan ref atau structured.
  4. Task.detached saat sebenarnya butuh structured.
  5. Capture strong self di long-running Task.
  6. await saat memegang lock manual.
  7. Task.sleep sebagai wait di test.
  8. DispatchQueue.main.async di code Swift Concurrency baru.
  9. CPU-heavy di @MainActor.
  10. Async function tanpa await di body.

Apa yang Harus Dipelajari Selanjutnya

  1. swift-actor-sendable-deep-dive.md — internal mechanics actor, executor, hop cost.
  2. swift-isolation-swift6.md — referensi isolation domain dan migration guide.
  3. swift-async-algorithms.md — operator pipeline untuk AsyncSequence yang sering berinteraksi dengan isolation.
  4. swift6-synchronization.mdMutex/Atomic untuk 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.