Section 3/181 menit

3. Teori: Arsitektur Internal SwiftData

3. Teori: Arsitektur Internal SwiftData

Layer Stack

swift
SwiftData API (@Model, @Query, ModelContext)
          ↓
   PersistentModel Protocol
   (generated by @Model macro)
          ↓
   ModelContext (unit of work, change tracking)
          ↓
   ModelContainer (schema + configuration)
          ↓
   NSPersistentContainer / NSPersistentStoreCoordinator
   (Core Data underneath)
          ↓
   SQLite / CloudKit store

SwiftData adalah wrapper modern di atas Core Data — bukan rewrite dari nol. Ini berarti:

  • Semua limitasi Core Data (tidak ada set operasi, tidak ada raw SQL, store tunggal per entity) tetap berlaku
  • Performa karakteristik Core Data (lazy fault, row cache, batch fetch) juga berlaku
  • Bisa interop dengan Core Data jika dibutuhkan

ModelContext sebagai Unit of Work

ModelContext mengimplementasikan Unit of Work pattern:

swift
1. Fetch → objek masuk "identity map" context
2. Mutate → perubahan dicatat di change buffer
3. save() → flush semua perubahan ke persistent store
4. rollback() / context deinit → buang semua perubahan

Satu model instance hanya boleh hidup di satu context. Passing instance antar context (misal: background → main) adalah data race — gunakan PersistentIdentifier sebagai jembatan.

Faulting: Lazy Loading per Default

swift
// SwiftData (seperti Core Data) menggunakan "fault" untuk relasi:
let post = try context.fetch(FetchDescriptor<Post>()).first!

// post.author belum di-load sampai kamu akses:
print(post.author.name)  // ← DI SINI baru fetch author dari SQLite (fault fires)

// Untuk query yang akan akses banyak relasi, lebih efisien prefetch:
var descriptor = FetchDescriptor<Post>()
descriptor.relationshipKeyPathsForPrefetching = [\.author, \.tags]
// Satu query JOIN daripada N+1 queries