PhotoKit — wat is het, kernbegrippen en PHAsset

Auteur: IT Sectr Gepubliceerd: 2026-05-06 Leestijd: 8 min

PhotoKit — is het Apple-framework voor het werken met de mediatheek op iOS en macOS, dat directe toegang biedt tot foto's, video's en Live Photos op het apparaat. Volgens Apple-documentatie vervangt het framework de verouderde AssetsLibrary en ondersteunt het iCloud, albums, bewerking en Change Tracking. PhotoKit biedt een uniforme API voor query's, caching en wijzigingen van de mediatheek met automatische synchronisatie via iCloud.

Belangrijkste punten

  • PhotoKit — Apple-framework voor het werken met de systeemmediatheek, die toegang biedt tot foto's, video's, Live Photos en albums.
  • PHAsset — gegevensmodel dat één media-inhoud (foto of video) vertegenwoordigt met metadata: datum, locatie, type.
  • PHFetchResult — container van queryresultaten met stream laden en wijzigingsmeldingen via PHPhotoLibraryChangeObserver.
  • PHImageManager — manager voor het ophalen van afbeeldingen met opties voor grootte, modus en caching via PHCachingImageManager.
  • PHPhotoLibrary — toegangspunt voor het uitvoeren van wijzigingen: maken, verwijderen en bewerken van media-objecten.

Wat is PhotoKit?

PhotoKit — Apple-framework (geïntroduceerd in iOS 8, macOS 10.11), dat een objectgeoriënteerde API biedt voor het werken met de systeemmediatheek. In tegenstelling tot AssetsLibrary behandelt PhotoKit de mediatheek als een database: query's retourneren objecten PHAsset, PHCollection, PHCollectionList, die de inhoud en opslagstructuur vertegenwoordigen.

PhotoKit ondersteunt alle mediatypen: foto's (JPEG, HEIF, RAW), video's (MOV, MP4), Live Photos en serie-opnamen. Het framework beheert automatisch iCloud-synchronisatie: als een afbeelding in iCloud is opgeslagen, vraagt PhotoKit deze via het netwerk op en rapporteert de voortgang via PHImageRequestOptions.progressHandler.

De belangrijkste functie van PhotoKit — het gegevensmodel gebaseerd op PHObject met een lokale identificatie (localIdentifier), die stabiel blijft tussen sessies. Dit maakt het mogelijk om verwijzingen naar media-objecten op te slaan en ze te herstellen na het herstarten van de app zonder een nieuwe query.

Hoe werkt PhotoKit: gegevensmodel en query's

PhotoKit is op drie niveaus gebouwd: gegevensmodel (PHObject), query's (PHFetchResult) en wijzigingen (PHPhotoLibrary.performChanges). Het gegevensmodel is hiërarchisch: PHAsset (foto/video) bevindt zich binnen PHAssetCollection (album), albums worden gegroepeerd in PHCollectionList (map).

Uitvoeren van query's

Query's worden uitgevoerd via PHAsset.fetchAssets en PHAssetCollection.fetchAssetCollections. Alle fetch-methoden zijn synchroon en retourneren PHFetchResult, waarvan het object onmiddellijk de query uitvoert op de database van de mediatheek. PHFetchResult ondersteunt snelle toegang via index (object(at:)) en enumeratie via enumerateObjects.

  • fetchAssets(with:options:) — query van alle media met filtering op type, datum, album
  • fetchAssetCollections(with:subtype:options:) — query van albums en mappen
  • fetchAssets(in:options:) — query van media binnen een specifiek album

PHFetchOptions

PHFetchOptions — object voor het configureren van de query: sortering (sortDescriptors), predicaat (predicate), inclusie van verborgen en verwijderde media (includeHiddenAssets, includeAllBurstAssets). Fetch-opties maken filtering op mediatype mogelijk: PHAssetMediaType.image, .video, .audio.

Belangrijkste klassen van PhotoKit

PhotoKit bevat een set klassen voor toegang, query's en wijziging van de mediatheek. Inzicht in elk ervan is noodzakelijk voor efficiënt werken met het framework.

PHAsset

PHAsset — onveranderlijk object dat één media-inhoud vertegenwoordigt. Bevat metadata: mediaType, mediaSubtypes, creationDate, location, pixelWidth, pixelHeight, duration (voor video), isFavorite, burstIdentifier. LocalIdentifier — stabiele tekstuele sleutel, zelfs toegankelijk na het herstarten van de app.

PHAssetCollection

PHAssetCollection — groep media: systeemalbums (Recents, Favorites, Selfies, Screenshots), gebruikersalbums of Moments (automatisch gegroepeerd op tijd en plaats). Attributen: localizedTitle, assetCollectionType, assetCollectionSubtype, startDate, endDate.

PHCollectionList

PHCollectionList — map die albums (PHAssetCollection) of andere mappen bevat. Zelden gebruikt, voornamelijk voor het tonen van hiërarchie in de gebruikersinterface.

PHImageManager en caching

PhotoKit retourneert geen UIImage rechtstreeks uit PHAsset — u moet de afbeelding via PHImageManager opvragen. Dit garandeert dat de afbeelding wordt geladen met inachtneming van iCloud, caching en de vereiste grootte.

ComponentDoelKenmerk
PHImageManager.default()Standaardmanager voor eenmalige query'sGeen caching tussen query's
PHCachingImageManagerManager met voorladen voor collectiesstartCachingImages voor vloeiend scrollen
PHImageRequestOptionsQuery-instellingen: grootte, modus, leveringsynchronous, deliveryMode, progressHandler
PHImageRequestIDQuery-identificatie voor annuleringcancelImageRequest(PHImageRequestID)

PHImageManager ondersteunt drie leveringsmodi: opportunistic (eerst verkleinde versie, daarna volledig), highQualityFormat (alleen volledige kwaliteit) en fastFormat (snelste beschikbare versie). Gebruik voor collecties altijd PHCachingImageManager met voorladen van afbeeldingen voor zichtbare cellen.

Voorbeelden van PhotoKit-gebruik in Swift

PhotoKit wordt gebruikt voor het maken van aangepaste galerijen, editors en apps voor het werken met media. Laten we drie belangrijke scenario's bekijken.

Alle foto's uit de mediatheek opvragen

PHAsset.fetchAssets met PHFetchOptions en sortering op aanmaakdatum — basisquery voor het bouwen van een aangepaste fotogalerij. PHFetchResult ondersteunt lazy-loading en stream-toegang.

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("Gevonden \(allPhotos.count) foto's")

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

PHFetchResult — thread-safe container. Toegang tot objecten via index via object(at:) blokkeert de UI niet, maar het opvragen van een afbeelding via PHImageManager moet asynchroon worden uitgevoerd.

Afbeelding laden met caching

PHCachingImageManager — subklasse van PHImageManager met methoden startCachingImages en stopCachingImages voor voorladen. Gebruikt in UICollectionView voor vloeiend scrollen.

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

// Voorladen voor zichtbare cellen
cachingManager.startCachingImages(
    for: visibleAssets,
    targetSize: targetSize,
    contentMode: .aspectFill,
    options: nil
)

// Afbeelding opvragen via PHImageRequestOptions met iCloud fallback
let requestOptions = PHImageRequestOptions()
requestOptions.deliveryMode = .opportunistic
requestOptions.isNetworkAccessAllowed = .true
requestOptions.progressHandler = { progress, error, stop, info in
    DispatchQueue.main.async {
        print("Bezig met laden uit iCloud: \(progress * 100)%")
    }
}

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

Mediatheek bewerken: toevoegen aan favorieten

Wijzigingen in de mediatheek worden uitgevoerd via PHPhotoLibrary.shared().performChanges binnen het changeRequest-blok. Alle bewerkingen worden gebundeld en transactioneel toegepast.

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

Wijzigingen en observatie via Change Tracking

PhotoKit biedt een mechanisme voor het observeren van wijzigingen in de mediatheek via het protocol PHPhotoLibraryChangeObserver. Bij elke wijziging (maken, verwijderen, bewerken) wordt de methode photoLibraryDidChange aangeroepen met een PHChange-object.

PHChange bevat changeDetails voor elk querytype: PHFetchResultChangeDetails met removedIndexes, insertedIndexes, changedIndexes. Dit maakt het mogelijk om wijzigingen in de UI met animatie toe te passen: performBatchUpdates met move, insert, delete voor 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
            // Wijzigingen toepassen op collectionView
        }
    }
}

RAW-bewerking en extensies

PhotoKit ondersteunt media-bewerking via het mechanisme PHContentEditingInput en PHContentEditingOutput. De app vraagt editingInput met originele gegevens aan, past wijzigingen toe en slaat het resultaat op via editingOutput. Het framework bewaart automatisch het origineel, zodat de gebruiker wijzigingen kan terugdraaien door te resetten naar het origineel.

RAW-foto's (DNG, CR2, NEF) worden ondersteund via PHAssetResourceManager, dat toegang biedt tot het originele RAW-bestand. Voor RAW-verwerking wordt aanbevolen CoreImage te gebruiken met het CIRAWFilter-filter, dat aanpassing van temperatuur, belichting en scherpte ondersteunt. PhotoKit ondersteunt ook editor-extensies via Photo Editing Extension (iOS) — de app kan vanuit de systeemeditor worden aangeroepen om de geselecteerde foto of video te verwerken.

Optimalisatie van het werken met PhotoKit

PhotoKit — een krachtig maar resource-intensief framework. Onjuist gebruik kan leiden tot vertraging bij scrollen en overmatig geheugengebruik. Volg de aanbevelingen voor optimale prestaties.

  • Gebruik PHCachingImageManager voor collecties — voorladen van afbeeldingen voor zichtbare +-1 scherm cellen elimineert vertragingen bij scrollen
  • Stel targetSize in — vraag nooit PHImageManagerMaximumSize voor miniaturen. Gebruik een grootte gelijk aan de fysieke celgrootte vermenigvuldigd met de scale van het scherm
  • Annuleer query's bij hergebruik van cellen — bewaar PHImageRequestID en roep cancelImageRequest aan in prepareForReuse
  • Beperk iCloud-query's — stel bij snel scrollen isNetworkAccessAllowed = false in en laad iCloud-foto's alleen bij stoppen
  • Cache PHFetchResult — herhaalde fetchAssets met dezelfde opties retourneert een nieuwe PHFetchResult. Bewaar het resultaat in een eigenschap en werk bij via Change Observer

PHLivePhoto — vereist een aparte query via PHLivePhoto.request(with:targetSize:contentMode:options:resultHandler:). Vraag geen Live Photo voor cellen waar alleen een foto wordt weergegeven — gebruik PHLivePhotoBadge voor indicatie.

Veelgestelde vragen

Wat is PhotoKit en hoe verschilt het van AssetsLibrary?

PhotoKit — een modern Apple-framework voor het werken met de mediatheek, geïntroduceerd in iOS 8. In tegenstelling tot de verouderde AssetsLibrary biedt PhotoKit het objectmodel PHAsset, PHFetchResult met snel zoeken, iCloud-ondersteuning en Change Tracking voor het observeren van wijzigingen.

Hoe vraag ik toegang tot de mediatheek via PhotoKit?

Roep PHPhotoLibrary.requestAuthorization(for: .readWrite) aan met afhandeling in de callback. Na het verkrijgen van de status .authorized kunt u PHAsset.fetchAssets-query's uitvoeren. Voor schrijven is .readWrite-toegang vereist. Voor alleen lezen — .addOnly.

Hoe krijg ik een afbeelding uit PHAsset?

Gebruik PHImageManager.default().requestImage met parameters: asset, targetSize, contentMode en PHImageRequestOptions. De asynchrone methode retourneert PHImageRequestID, waarmee de query kan worden geannuleerd. Gebruik voor collecties PHCachingImageManager met voorladen.

Hoe volg ik wijzigingen in de mediatheek?

Registreer de waarnemer via PHPhotoLibrary.shared().register(self) en implementeer het protocol PHPhotoLibraryChangeObserver. In de methode photoLibraryDidChange ontvangt u PHChange met changeDetails voor elke fetchResult en past u de wijzigingen met animatie toe in de UI.

Hoe ga ik om met iCloud-foto's in PhotoKit?

Stel in PHImageRequestOptions isNetworkAccessAllowed = true in en progressHandler voor het volgen van laden uit iCloud. Schakel bij snel scrollen de netwerktoegang uit en laad alleen lokale versies om vertragingen bij scrollen te voorkomen.

Samenvatting

  • PhotoKit — Apple-framework voor het werken met de mediatheek, dat AssetsLibrary heeft vervangen vanaf iOS 8 en macOS 10.11.
  • PHAsset — het belangrijkste gegevensmodel met lokale identificatie, type, datum, locatie en grootte.
  • PHFetchResult voert een synchrone query uit op de opslag en biedt thread-safe toegang tot resultaten.
  • PHCachingImageManager met voorladen zorgt voor vloeiend scrollen in collecties zonder vertragingen.
  • Change Tracking via PHPhotoLibraryChangeObserver stelt de UI in staat onmiddellijk te reageren op wijzigingen in de mediatheek.
  • iCloud-synchronisatie is ingebouwd in het framework: het opvragen van een afbeelding laadt deze automatisch uit iCloud met voortgang.
  • Optimalisatie — juiste targetSize, annuleren van query's en beperking van iCloud bij scrollen zijn cruciaal voor prestaties.

We ontwikkelen een mobiele applicatie turnkey

IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.

Bespreek het project

Lees ook