PhotoKit — nedir, temel kavramlar ve PHAsset

Yazar: IT Sectr Yayınlanma: 2026-05-06 Okuma süresi: 8 dk

PhotoKit, iOS ve macOS’ta medya kitaplığı ile çalışmak için Apple framework’üdür ve cihazdaki fotoğraflara, videolara ve Live Photos’a doğrudan erişim sağlar. Apple dokümantasyonuna göre framework, eski AssetsLibrary’nin yerini alır ve iCloud, albümler, düzenleme ve Change Tracking’i destekler. PhotoKit, iCloud üzerinden otomatik senkronizasyon ile sorgular, önbellekleme ve medya kitaplığı değişiklikleri için birleşik bir API sağlar.

Temel Noktalar

  • PhotoKit, sistem medya kitaplığı ile çalışmak için Apple framework’üdür ve fotoğraflara, videolara, Live Photos’a ve albümlere erişim sağlar.
  • PHAsset, meta verilerle (tarih, konum, tür) tek bir medya öğesini (fotoğraf veya video) temsil eden bir veri modelidir.
  • PHFetchResult, PHPhotoLibraryChangeObserver aracılığıyla temel yükleme ve değişiklik bildirimleri ile sorgu sonuçları kabıdır.
  • PHImageManager, PHCachingImageManager aracılığıyla boyut, mod ve önbellekleme seçenekleriyle görüntü almak için yöneticidir.
  • PHPhotoLibrary, değişiklikleri gerçekleştirmek için giriş noktasıdır: medya nesneleri oluşturma, silme ve düzenleme.

PhotoKit Nedir?

PhotoKit, sistem medya kitaplığı ile çalışmak için nesne yönelimli bir API sağlayan Apple framework’üdür (iOS 8, macOS 10.11’de tanıtıldı). AssetsLibrary’nin aksine PhotoKit, medya kitaplığını bir veritabanı olarak ele alır: sorgular, içeriği ve depolama yapısını temsil eden PHAsset, PHCollection ve PHCollectionList nesnelerini döndürür.

PhotoKit tüm medya türlerini destekler: fotoğraflar (JPEG, HEIF, RAW), videolar (MOV, MP4), Live Photos ve seri çekimler. Framework, iCloud senkronizasyonunu otomatik olarak yönetir: bir görüntü iCloud’da depolanmışsa, PhotoKit bunu ağ üzerinden talep eder ve ilerlemeyi PHImageRequestOptions.progressHandler aracılığıyla bildirir.

PhotoKit’in temel özelliği, oturumlar arasında sabit kalan yerel bir tanımlayıcıya (localIdentifier) sahip PHObject tabanlı veri modelidir. Bu, medya nesnelerine referansları kaydetmenize ve yeniden sorgulamadan uygulama yeniden başlatıldıktan sonra bunları geri yüklemenize olanak tanır.

PhotoKit Nasıl Çalışır: Veri Modeli ve Sorgular

PhotoKit üç düzeyde oluşturulmuştur: veri modeli (PHObject), sorgular (PHFetchResult) ve değişiklikler (PHPhotoLibrary.performChanges). Veri modeli hiyerarşiktir: PHAsset (fotoğraf/video) PHAssetCollection (albüm) içinde bulunur ve albümler PHCollectionList (klasör) içinde gruplanır.

Sorguları Gerçekleştirme

Sorgular PHAsset.fetchAssets ve PHAssetCollection.fetchAssetCollections aracılığıyla yürütülür. Tüm getirme yöntemleri eşzamanlıdır ve PHFetchResult döndürür; bu da sorguyu hemen medya kitaplığı veritabanında yürütür. PHFetchResult, dizine göre hızlı erişimi (object(at:)) ve enumerateObjects aracılığıyla numaralandırmayı destekler.

  • fetchAssets(with:options:) — tür, tarih, albüme göre filtrelenmiş tüm medyayı sorgulama
  • fetchAssetCollections(with:subtype:options:) — albümleri ve klasörleri sorgulama
  • fetchAssets(in:options:) — belirli bir albüm içindeki medyayı sorgulama

PHFetchOptions

PHFetchOptions, sorguları yapılandırmak için bir nesnedir: sıralama (sortDescriptors), yüklem (predicate), gizli ve silinmiş medyayı dahil etme (includeHiddenAssets, includeAllBurstAssets). Getirme seçenekleri, medya türüne göre filtrelemeye izin verir: PHAssetMediaType.image, .video, .audio.

PhotoKit’in Temel Sınıfları

PhotoKit, medya kitaplığına erişmek, sorgulamak ve değiştirmek için bir dizi sınıf içerir. Framework ile etkili bir şekilde çalışmak için her birini anlamak önemlidir.

PHAsset

PHAsset, tek bir medya öğesini temsil eden değiştirilemez bir nesnedir. Meta veriler içerir: mediaType, mediaSubtypes, creationDate, location, pixelWidth, pixelHeight, duration (video için), isFavorite, burstIdentifier. LocalIdentifier, uygulama yeniden başlatıldıktan sonra bile erişilebilen sabit bir dize anahtarıdır.

PHAssetCollection

PHAssetCollection bir medya grubudur: sistem albümleri (Recents, Favorites, Selfies, Screenshots), kullanıcı albümleri veya Moments (zamana ve yere göre otomatik olarak gruplandırılmış). Öznitelikler: localizedTitle, assetCollectionType, assetCollectionSubtype, startDate, endDate.

PHCollectionList

PHCollectionList, albümler (PHAssetCollection) veya diğer klasörler içeren bir klasördür. Genellikle kullanıcı arayüzünde hiyerarşiyi görüntülemek için kullanılır ve nadiren kullanılır.

PHImageManager ve Önbellekleme

PhotoKit, PHAsset’ten doğrudan UIImage döndürmez — bir görüntüyü PHImageManager aracılığıyla talep etmeniz gerekir. Bu, görüntünün iCloud desteği, önbellekleme ve gerekli boyutla yüklenmesini sağlar.

BileşenAmaçÖzellik
PHImageManager.default()Tek seferlik istekler için standart yöneticiTalep arasında önbellekleme yok
PHCachingImageManagerKoleksiyonlar için ön yüklemeli yöneticiDüzgün kaydırma için startCachingImages
PHImageRequestOptionsTalep ayarları: boyut, mod, teslimatsynchronous, deliveryMode, progressHandler
PHImageRequestIDİptal için talep tanımlayıcısıcancelImageRequest(PHImageRequestID)

PHImageManager üç teslimat modunu destekler: opportunistic (önce küçültülmüş sürüm, sonra tam), highQualityFormat (yalnızca tam kalite) ve fastFormat (en hızlı kullanılabilir sürüm). Koleksiyonlar için her zaman görünür hücreler için görüntü ön yüklemesi ile PHCachingImageManager kullanın.

Swift’te PhotoKit Kullanım Örnekleri

PhotoKit, özel galeriler, düzenleyiciler ve medya uygulamaları oluşturmak için kullanılır. Üç temel senaryoya bakalım.

Medya Kitaplığından Tüm Fotoğrafları Alma

Oluşturma tarihine göre sıralanmış PHFetchOptions ile PHAsset.fetchAssets, özel bir fotoğraf galerisi oluşturmak için temel sorgudur. PHFetchResult, temel yükleme ve akış erişimini destekler.

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("\(allPhotos.count) fotoğraf bulundu")

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

PHFetchResult iş parçacığı güvenli bir kaptır. object(at:) aracılığıyla nesnelere dizine göre erişmek kullanıcı arayüzünü engellemez, ancak PHImageManager aracılığıyla görüntü talep etmek eşzamansız olarak yapılmalıdır.

Görüntüleri Önbellekleme ile Yükleme

PHCachingImageManager, ön yükleme için startCachingImages ve stopCachingImages yöntemlerine sahip PHImageManager’ın bir alt sınıfıdır. Düzgün kaydırma için UICollectionView’da kullanılır.

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

// Görünür hücreler için ön yükleme
cachingManager.startCachingImages(
    for: visibleAssets,
    targetSize: targetSize,
    contentMode: .aspectFill,
    options: nil
)

// iCloud yedeklemeli PHImageRequestOptions ile görüntü talebi
let requestOptions = PHImageRequestOptions()
requestOptions.deliveryMode = .opportunistic
requestOptions.isNetworkAccessAllowed = .true
requestOptions.progressHandler = { progress, error, stop, info in
    DispatchQueue.main.async {
        print("iCloud’tan indiriliyor: \(progress * 100)%")
    }
}

let requestID = cachingManager.requestImage(
    for: asset,
    targetSize: targetSize,
    contentMode: .aspectFill,
    options: requestOptions
) { image, info in
    print("Görüntü alındı: \(image?.size ?? .zero)")
}

Medya Kitaplığını Düzenleme: Favorilere Ekleme

Medya kitaplığındaki değişiklikler, changeRequest bloğu içinde PHPhotoLibrary.shared().performChanges aracılığıyla gerçekleştirilir. Tüm işlemler toplu olarak işlenir ve işlemsel olarak uygulanır.

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

Change Tracking ile Değişiklikler ve Gözlem

PhotoKit, PHPhotoLibraryChangeObserver protokolü aracılığıyla medya kitaplığı değişikliklerini gözlemlemek için bir mekanizma sağlar. Herhangi bir değişiklik (oluşturma, silme, düzenleme) meydana geldiğinde, bir PHChange nesnesi ile photoLibraryDidChange yöntemi çağrılır.

PHChange, her sorgu türü için changeDetails içerir: PHFetchResultChangeDetails, removedIndexes, insertedIndexes, changedIndexes içerir. Bu, UICollectionView için performBatchUpdates (move, insert, delete) ile animasyonlu olarak kullanıcı arayüzünde değişikliklerin uygulanmasını sağlar.

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
            // collectionView’a değişiklikleri uygula
        }
    }
}

RAW Düzenleme ve Uzantılar

PhotoKit, PHContentEditingInput ve PHContentEditingOutput mekanizması aracılığıyla medya düzenlemeyi destekler. Uygulama, orijinal verilerle editingInput talep eder, değişiklikleri uygular ve sonucu editingOutput aracılığıyla kaydeder. Framework otomatik olarak orijinali korur ve kullanıcıların orijinale sıfırlayarak değişiklikleri geri almasına olanak tanır.

RAW fotoğraflar (DNG, CR2, NEF), orijinal RAW dosyasına erişim sağlayan PHAssetResourceManager aracılığıyla desteklenir. RAW işleme için, sıcaklık, pozlama ve keskinlik ayarını destekleyen CIRAWFilter filtreli CoreImage kullanılması önerilir. PhotoKit ayrıca Photo Editing Extension (iOS) aracılığıyla düzenleyici uzantılarını da destekler — seçili bir fotoğrafı veya videoyu işlemek için sistem düzenleyicisinden bir uygulama çağrılabilir.

PhotoKit Performans Optimizasyonu

PhotoKit güçlü ancak kaynak yoğun bir framework’tür. Yanlış kullanım, kaydırma gecikmesine ve aşırı bellek tüketimine yol açabilir. En iyi performans için bu önerilere uyun.

  • Koleksiyonlar için PHCachingImageManager kullanın — görünür +/-1 ekran hücreleri için görüntü ön yüklemesi kaydırma gecikmesini ortadan kaldırır
  • targetSize ayarlayın — küçük resimler için asla PHImageManagerMaximumSize talep etmeyin. Hücrenin fiziksel boyutunun ekran ölçeğiyle çarpımına eşit bir boyut kullanın
  • Hücre yeniden kullanımında talepleri iptal edin — PHImageRequestID kaydedin ve prepareForReuse içinde cancelImageRequest çağrın
  • iCloud taleplerini sınırlayın — hızlı kaydırma sırasında isNetworkAccessAllowed = false ayarlayın ve yalnızca durduğunuzda iCloud fotoğraflarını yükleyin
  • PHFetchResult’u önbelleğe alın — aynı seçeneklerle tekrarlanan fetchAssets yeni bir PHFetchResult döndürür. Sonucu bir özellik olarak kaydedin ve Change Observer aracılığıyla güncelleyin

PHLivePhoto, PHLivePhoto.request(with:targetSize:contentMode:options:resultHandler:) aracılığıyla ayrı bir talep gerektirir. Yalnızca fotoğraf görüntüleyen hücreler için Live Photo talep etmeyin — gösterge olarak PHLivePhotoBadge kullanın.

Sıkça Sorulan Sorular

PhotoKit nedir ve AssetsLibrary’den farkı nedir?

PhotoKit, iOS 8’de tanıtılan, medya kitaplığı ile çalışmak için modern bir Apple framework’üdür. Eski AssetsLibrary’nin aksine PhotoKit, PHAsset nesne modeli, hızlı aramalı PHFetchResult, iCloud desteği ve değişiklikleri gözlemlemek için Change Tracking sağlar.

PhotoKit aracılığıyla medya kitaplığına erişim nasıl talep edilir?

Bir geri çağrı işleyicisi ile PHPhotoLibrary.requestAuthorization(for: .readWrite) çağrın. .authorized durumunu aldıktan sonra PHAsset.fetchAssets sorgularını çalıştırabilirsiniz. Yazma erişimi için .readWrite izni gerekir. Yalnızca okuma için — .addOnly.

PHAsset’ten görüntü nasıl alınır?

Parametrelerle PHImageManager.default().requestImage kullanın: asset, targetSize, contentMode ve PHImageRequestOptions. Eşzamansız yöntem PHImageRequestID döndürür ve talebi iptal etmenize olanak tanır. Koleksiyonlar için ön yüklemeli PHCachingImageManager kullanın.

Medya kitaplığındaki değişiklikler nasıl izlenir?

PHPhotoLibrary.shared().register(self) aracılığıyla bir gözlemci kaydedin ve PHPhotoLibraryChangeObserver protokolünü uygulayın. photoLibraryDidChange yönteminde, her fetchResult için changeDetails ile PHChange alın ve animasyonla kullanıcı arayüzünde değişiklikleri uygulayın.

PhotoKit’te iCloud fotoğrafları nasıl yönetilir?

PHImageRequestOptions içinde, iCloud indirme ilerlemesini izlemek için isNetworkAccessAllowed = true ve bir progressHandler ayarlayın. Hızlı kaydırma sırasında ağ erişimini devre dışı bırakın ve kaydırma gecikmelerini önlemek için yalnızca yerel sürümleri yükleyin.

Özet

  • PhotoKit, iOS 8 ve macOS 10.11’den itibaren AssetsLibrary’nin yerini alan, medya kitaplığı ile çalışmak için Apple framework’üdür.
  • PHAsset, yerel tanımlayıcı, tür, tarih, konum ve boyut ile temel veri modelidir.
  • PHFetchResult, depolamaya eşzamanlı sorgular gerçekleştirir ve sonuçlara iş parçacığı güvenli erişim sağlar.
  • PHCachingImageManager ön yükleme ile koleksiyonlarda gecikmesiz düzgün kaydırma sağlar.
  • Change Tracking (PHPhotoLibraryChangeObserver), kullanıcı arayüzünün medya kitaplığı değişikliklerine anında tepki vermesini sağlar.
  • iCloud senkronizasyonu framework’e yerleşikti: görüntü talep etmek, onu otomatik olarak iCloud’dan ilerlemeyle indirir.
  • Optimizasyon — uygun targetSize, talep iptali ve kaydırma sırasında iCloud sınırlaması performans için kritiktir.

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun