Section 5/131 menit

5. @ObservationIgnored — Opt-out dari Tracking

5. @ObservationIgnored — Opt-out dari Tracking

Property yang diberi @ObservationIgnored tidak akan di-track — perubahan pada property ini tidak akan men-trigger re-render View manapun.

swift
@Observable
final class DataViewModel {
    // Di-track — perubahan memicu re-render
    var visibleItems: [Item] = []
    var isLoading: Bool = false

    // Tidak di-track — perubahan tidak memicu re-render apapun.
    // Gunakan untuk: internal cache, logging, metadata, dependencies eksternal.
    @ObservationIgnored
    private var internalCache: [String: Item] = [:]

    @ObservationIgnored
    private var networkService: NetworkService = NetworkService()

    @ObservationIgnored
    var lastRefreshDate: Date? = nil  // metadata yang tidak perlu tampil di UI

    // Computed property yang HANYA mengakses @ObservationIgnored property
    // → tidak men-trigger observation apapun.
    var cacheSize: Int {
        internalCache.count  // mengakses ignored property — tidak di-track
    }

    func refresh() async {
        isLoading = true  // tracked — View akan update
        let items = await networkService.fetchItems()  // ignored property — tidak trigger observation
        internalCache = Dictionary(uniqueKeysWithValues: items.map { ($0.id, $0) })  // ignored
        visibleItems = items  // tracked — View akan update
        lastRefreshDate = Date()  // ignored — View tidak di-render ulang
        isLoading = false  // tracked — View akan update
    }
}