Section 8/131 menit

8. @preconcurrency

8. @preconcurrency

Teori: Library Lama Belum Adopt Sendable

Banyak library populer (Firebase, Realm, Alamofire versi lama) belum menandai tipe mereka sebagai Sendable. Saat kamu menggunakannya di kode async, compiler memunculkan warning.

@preconcurrency import

swift
// Suppress semua warning Sendable dari module ini
@preconcurrency import RealmSwift
@preconcurrency import FirebaseFirestore

// Sekarang bisa gunakan tipe dari library tanpa warning
actor DataRepository {
    func fetchFromFirestore() async throws -> [QueryDocumentSnapshot] {
        // QueryDocumentSnapshot bukan Sendable, tapi warning di-suppress
        let snapshot = try await db.collection("users").getDocuments()
        return snapshot.documents
    }
}

@preconcurrency pada Protocol Conformance

swift
// Protocol dari library lama yang belum adopt Sendable
@preconcurrency
protocol LegacyDataSource: AnyObject {
    func fetchData(completion: @escaping ([String]) -> Void)
}

// Implementasi tanpa warning
class ModernDataSource: LegacyDataSource, @preconcurrency Sendable {
    func fetchData(completion: @escaping ([String]) -> Void) {
        Task {
            let data = await loadAsync()
            completion(data)
        }
    }
}

Catatan: @preconcurrency bersifat sementara — idealnya dihapus setelah library bersangkutan sudah update dan conform Sendable dengan benar.