PhotoKit — apa itu, konsep kunci dan PHAsset

Penulis: IT Sectr Diterbitkan: 2026-05-06 Waktu membaca: 8 mnt

PhotoKit — adalah framework Apple untuk bekerja dengan medioteks di iOS dan macOS, menyediakan akses langsung ke foto, video, dan Live Photos di perangkat. Menurut dokumentasi Apple, framework ini menggantikan AssetsLibrary yang sudah usang dan mendukung iCloud, album, pengeditan, dan Change Tracking. PhotoKit menyediakan API terpadu untuk kueri, caching, dan perubahan medioteks dengan sinkronisasi otomatis melalui iCloud.

Poin Utama

  • PhotoKit — framework Apple untuk bekerja dengan medioteks sistem, menyediakan akses ke foto, video, Live Photos, dan album.
  • PHAsset — model data yang mewakili satu konten media (foto atau video) dengan metadata: tanggal, lokasi, tipe.
  • PHFetchResult — wadah hasil kueri dengan pemuatan streaming dan pemberitahuan perubahan melalui PHPhotoLibraryChangeObserver.
  • PHImageManager — manajer untuk mendapatkan gambar dengan opsi ukuran, mode, dan caching melalui PHCachingImageManager.
  • PHPhotoLibrary — titik masuk untuk melakukan perubahan: membuat, menghapus, dan mengedit objek media.

Apa itu PhotoKit?

PhotoKit — framework Apple (diperkenalkan di iOS 8, macOS 10.11), menyediakan API berorientasi objek untuk bekerja dengan medioteks sistem. Tidak seperti AssetsLibrary, PhotoKit bekerja dengan medioteks seperti database: kueri mengembalikan objek PHAsset, PHCollection, PHCollectionList, yang mewakili konten dan struktur penyimpanan.

PhotoKit mendukung semua jenis media: foto (JPEG, HEIF, RAW), video (MOV, MP4), Live Photos, dan foto beruntun. Framework secara otomatis mengelola sinkronisasi iCloud: jika gambar disimpan di iCloud, PhotoKit memintanya melalui jaringan dan melaporkan kemajuan melalui PHImageRequestOptions.progressHandler.

Fitur kunci PhotoKit — model data berbasis PHObject dengan pengidentifikasi lokal (localIdentifier), yang tetap stabil antar sesi. Ini memungkinkan menyimpan referensi ke objek media dan memulihkannya setelah restart aplikasi tanpa kueri ulang.

Bagaimana PhotoKit bekerja: model data dan kueri

PhotoKit dibangun di tiga tingkat: model data (PHObject), kueri (PHFetchResult) dan perubahan (PHPhotoLibrary.performChanges). Model data bersifat hierarkis: PHAsset (foto/video) berada di dalam PHAssetCollection (album), album dikelompokkan dalam PHCollectionList (folder).

Menjalankan kueri

Kueri dijalankan melalui PHAsset.fetchAssets dan PHAssetCollection.fetchAssetCollections. Semua metode fetch bersifat sinkron dan mengembalikan PHFetchResult, yang objeknya segera menjalankan kueri ke database medioteks. PHFetchResult mendukung akses cepat berdasarkan indeks (object(at:)) dan enumerasi melalui enumerateObjects.

  • fetchAssets(with:options:) — kueri semua media dengan filter berdasarkan tipe, tanggal, album
  • fetchAssetCollections(with:subtype:options:) — kueri album dan folder
  • fetchAssets(in:options:) — kueri media di dalam album tertentu

PHFetchOptions

PHFetchOptions — objek untuk konfigurasi kueri: pengurutan (sortDescriptors), predikat (predicate), penyertaan media tersembunyi dan terhapus (includeHiddenAssets, includeAllBurstAssets). Opsi fetch memungkinkan pemfilteran berdasarkan tipe media: PHAssetMediaType.image, .video, .audio.

Kelas utama PhotoKit

PhotoKit mencakup serangkaian kelas untuk akses, kueri, dan perubahan medioteks. Memahami masing-masing kelas diperlukan untuk bekerja secara efektif dengan framework.

PHAsset

PHAsset — objek tidak berubah yang mewakili satu konten media. Berisi metadata: mediaType, mediaSubtypes, creationDate, location, pixelWidth, pixelHeight, duration (untuk video), isFavorite, burstIdentifier. LocalIdentifier — kunci teks stabil, tersedia bahkan setelah restart aplikasi.

PHAssetCollection

PHAssetCollection — kelompok media: album sistem (Recents, Favorites, Selfies, Screenshots), album pengguna atau Moments (dikelompokkan secara otomatis berdasarkan waktu dan tempat). Atribut: localizedTitle, assetCollectionType, assetCollectionSubtype, startDate, endDate.

PHCollectionList

PHCollectionList — folder yang berisi album (PHAssetCollection) atau folder lain. Jarang digunakan, terutama untuk menampilkan hierarki di antarmuka pengguna.

PHImageManager dan caching

PhotoKit tidak mengembalikan UIImage langsung dari PHAsset — Anda perlu meminta gambar melalui PHImageManager. Ini menjamin bahwa gambar dimuat dengan mempertimbangkan iCloud, caching, dan ukuran yang diperlukan.

KomponenTujuanFitur
PHImageManager.default()Manajer standar untuk kueri tunggalTidak ada caching antar kueri
PHCachingImageManagerManajer dengan pramuat untuk koleksistartCachingImages untuk scrolling halus
PHImageRequestOptionsPengaturan kueri: ukuran, mode, pengirimansynchronous, deliveryMode, progressHandler
PHImageRequestIDPengidentifikasi kueri untuk pembatalancancelImageRequest(PHImageRequestID)

PHImageManager mendukung tiga mode pengiriman: opportunistic (pertama versi diperkecil, lalu lengkap), highQualityFormat (hanya kualitas penuh) dan fastFormat (versi tercepat yang tersedia). Untuk koleksi selalu gunakan PHCachingImageManager dengan pramuat gambar untuk sel yang terlihat.

Contoh penggunaan PhotoKit di Swift

PhotoKit digunakan untuk membuat galeri kustom, editor, dan aplikasi untuk bekerja dengan media. Mari kita bahas tiga skenario kunci.

Kueri semua foto dari medioteks

PHAsset.fetchAssets dengan PHFetchOptions dan pengurutan berdasarkan tanggal pembuatan — kueri dasar untuk membangun galeri foto kustom. PHFetchResult mendukung lazy-loading dan akses streaming.

swift
let options = PHFetchOptions()
options.sortDescriptors = [NSSortDescriptor(
    key: "creationDate",
    ascending: .false
)]
options.predicate = NSPredicate(
    format: "mediaType == %d",
    PHAssetMediaType.image.rawValue
)

let allPhotos = PHAsset.fetchAssets(with: options)
print("Ditemukan \(allPhotos.count) foto")

allPhotos.enumerateObjects { asset, index, stop in
    print("Foto \(index): \(asset.localIdentifier)")
}

PHFetchResult — wadah thread-safe. Akses ke objek berdasarkan indeks melalui object(at:) tidak memblokir UI, tetapi permintaan gambar melalui PHImageManager harus dijalankan secara asinkron.

Memuat gambar dengan caching

PHCachingImageManager — subclass PHImageManager dengan metode startCachingImages dan stopCachingImages untuk pramuat. Digunakan di UICollectionView untuk scrolling halus.

swift
let cachingManager = PHCachingImageManager()
let targetSize = CGSize(width: 200, height: 200)

// Pramuat untuk sel yang terlihat
cachingManager.startCachingImages(
    for: visibleAssets,
    targetSize: targetSize,
    contentMode: .aspectFill,
    options: nil
)

// Permintaan gambar melalui PHImageRequestOptions dengan fallback iCloud
let requestOptions = PHImageRequestOptions()
requestOptions.deliveryMode = .opportunistic
requestOptions.isNetworkAccessAllowed = .true
requestOptions.progressHandler = { progress, error, stop, info in
    DispatchQueue.main.async {
        print("Mengunduh dari iCloud: \(progress * 100)%")
    }
}

let requestID = cachingManager.requestImage(
    for: asset,
    targetSize: targetSize,
    contentMode: .aspectFill,
    options: requestOptions
) { image, info in
    print("Gambar diterima: \(image?.size ?? .zero)")
}

Mengedit medioteks: menambahkan ke favorit

Perubahan di medioteks dilakukan melalui PHPhotoLibrary.shared().performChanges di dalam blok changeRequest. Semua operasi dikelompokkan dan diterapkan secara transaksional.

swift
PHPhotoLibrary.shared().performChanges {
    let changeRequest = PHAssetChangeRequest(for: asset)
    changeRequest.isFavorite = .true
} completionHandler: { success, error in
    if success {
        print("Ditambahkan ke favorit")
    }
}

Perubahan dan observasi melalui Change Tracking

PhotoKit menyediakan mekanisme observasi perubahan di medioteks melalui protokol PHPhotoLibraryChangeObserver. Pada setiap perubahan (membuat, menghapus, mengedit) metode photoLibraryDidChange dipanggil dengan objek PHChange.

PHChange berisi changeDetails untuk setiap tipe kueri: PHFetchResultChangeDetails dengan removedIndexes, insertedIndexes, changedIndexes. Ini memungkinkan penerapan perubahan di UI dengan animasi: performBatchUpdates dengan move, insert, delete untuk UICollectionView.

swift
class PhotosViewController: UIViewController {
    var fetchResult: PHFetchResult>PHAsset>?

    override func viewDidLoad() {
        super.viewDidLoad()
        PHPhotoLibrary.shared().register(self)
    }

    deinit {
        PHPhotoLibrary.shared().unregisterChangeObserver(self)
    }
}

extension PhotosViewController: PHPhotoLibraryChangeObserver {
    func photoLibraryDidChange(_ changeInstance: PHChange) {
        guard let fetchResult,
              let details = changeInstance.changeDetails(for: fetchResult)
        else { return }

        DispatchQueue.main.async {
            self.fetchResult = details.fetchResultAfterChanges
            // Terapkan perubahan ke collectionView
        }
    }
}

Pengeditan RAW dan ekstensi

PhotoKit mendukung pengeditan media melalui mekanisme PHContentEditingInput dan PHContentEditingOutput. Aplikasi meminta editingInput dengan data asli, menerapkan perubahan, dan menyimpan hasil melalui editingOutput. Framework secara otomatis menyimpan asli, memungkinkan pengguna untuk membatalkan perubahan melalui reset ke asli.

Foto RAW (DNG, CR2, NEF) didukung melalui PHAssetResourceManager, yang menyediakan akses ke file RAW asli. Untuk pemrosesan RAW disarankan menggunakan CoreImage dengan filter CIRAWFilter, yang mendukung penyesuaian suhu, eksposur, dan ketajaman. PhotoKit juga mendukung ekstensi editor melalui Photo Editing Extension (iOS) — aplikasi dapat dipanggil dari editor sistem untuk memproses foto atau video yang dipilih.

Optimalisasi kerja dengan PhotoKit

PhotoKit — framework yang kuat namun membutuhkan sumber daya. Penggunaan yang salah dapat menyebabkan perlambatan saat scrolling dan konsumsi memori berlebihan. Ikuti rekomendasi untuk kinerja optimal.

  • Gunakan PHCachingImageManager untuk koleksi — pramuat gambar untuk sel yang terlihat +-1 layar menghilangkan keterlambatan saat scrolling
  • Atur targetSize — jangan pernah meminta PHImageManagerMaximumSize untuk thumbnail. Gunakan ukuran yang sama dengan ukuran fisik sel dikalikan dengan scale layar
  • Batalkan kueri saat sel digunakan kembali — simpan PHImageRequestID dan panggil cancelImageRequest di prepareForReuse
  • Batasi kueri iCloud — saat scrolling cepat atur isNetworkAccessAllowed = false dan muat foto iCloud hanya saat berhenti
  • Cache PHFetchResult — fetchAssets berulang dengan opsi yang sama mengembalikan PHFetchResult baru. Simpan hasil di properti dan perbarui melalui Change Observer

PHLivePhoto — memerlukan kueri terpisah melalui PHLivePhoto.request(with:targetSize:contentMode:options:resultHandler:). Jangan meminta Live Photo untuk sel yang hanya menampilkan foto — gunakan PHLivePhotoBadge untuk indikasi.

Pertanyaan yang Sering Diajukan

Apa itu PhotoKit dan apa perbedaannya dengan AssetsLibrary?

PhotoKit — framework modern Apple untuk bekerja dengan medioteks, diperkenalkan di iOS 8. Tidak seperti AssetsLibrary yang usang, PhotoKit menyediakan model objek PHAsset, PHFetchResult dengan pencarian cepat, dukungan iCloud, dan Change Tracking untuk observasi perubahan.

Bagaimana cara meminta akses ke medioteks melalui PhotoKit?

Panggil PHPhotoLibrary.requestAuthorization(for: .readWrite) dengan penanganan di callback. Setelah mendapatkan status .authorized Anda dapat menjalankan kueri PHAsset.fetchAssets. Untuk menulis diperlukan akses .readWrite. Untuk hanya baca — .addOnly.

Bagaimana cara mendapatkan gambar dari PHAsset?

Gunakan PHImageManager.default().requestImage dengan parameter: asset, targetSize, contentMode dan PHImageRequestOptions. Metode asinkron mengembalikan PHImageRequestID, memungkinkan pembatalan kueri. Untuk koleksi gunakan PHCachingImageManager dengan pramuat.

Bagaimana cara melacak perubahan di medioteks?

Daftarkan pengamat melalui PHPhotoLibrary.shared().register(self) dan implementasikan protokol PHPhotoLibraryChangeObserver. Di metode photoLibraryDidChange Anda akan menerima PHChange dengan changeDetails untuk setiap fetchResult dan terapkan perubahan di UI dengan animasi.

Bagaimana cara menangani foto iCloud di PhotoKit?

Di PHImageRequestOptions atur isNetworkAccessAllowed = true dan progressHandler untuk melacak pemuatan dari iCloud. Saat scrolling cepat nonaktifkan akses jaringan dan muat hanya versi lokal untuk menghindari keterlambatan saat scrolling.

Ringkasan

  • PhotoKit — framework Apple untuk bekerja dengan medioteks, yang menggantikan AssetsLibrary sejak iOS 8 dan macOS 10.11.
  • PHAsset — model data utama dengan pengidentifikasi lokal, tipe, tanggal, lokasi, dan ukuran.
  • PHFetchResult menjalankan kueri sinkron ke penyimpanan dan menyediakan akses thread-safe ke hasil.
  • PHCachingImageManager dengan pramuat memastikan scrolling halus di koleksi tanpa keterlambatan.
  • Change Tracking melalui PHPhotoLibraryChangeObserver memungkinkan UI langsung merespons perubahan di medioteks.
  • Sinkronisasi iCloud terintegrasi dalam framework: permintaan gambar secara otomatis memuatnya dari iCloud dengan kemajuan.
  • Optimalisasi — targetSize yang tepat, pembatalan kueri, dan pembatasan iCloud saat scrolling sangat penting untuk kinerja.

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga