PhotoKit — mi ez, kulcsfogalmak és PHAsset

Szerző: IT Sectr Megjelenés: 2026-05-06 Olvasási idő: 8 perc

PhotoKit — az Apple keretrendszere a médiatárral való munkához iOS és macOS rendszeren, közvetlen hozzáférést biztosítva a fényképekhez, videókhoz és Live Photos-hoz az eszközön. Az Apple dokumentációja szerint a keretrendszer felváltja az elavult AssetsLibrary-t, és támogatja az iCloud-ot, albumokat, szerkesztést és Change Tracking-et. PhotoKit egységes API-t biztosít a lekérdezésekhez, gyorsítótárazáshoz és a médiatár módosításaihoz automatikus szinkronizálással az iCloud-on keresztül.

Főbb pontok

  • PhotoKit — Apple keretrendszer a rendszermédiatárral való munkához, hozzáférést biztosítva fényképekhez, videókhoz, Live Photos-hoz és albumokhoz.
  • PHAsset — adatmodell, amely egyetlen médiatartalmat (fénykép vagy videó) reprezentál metaadatokkal: dátum, hely, típus.
  • PHFetchResult — lekérdezési eredmények tárolója adatfolyam-betöltéssel és változásértesítésekkel a PHPhotoLibraryChangeObserver-en keresztül.
  • PHImageManager — menedzser képek lekéréséhez méret-, mód- és gyorsítótárazási opciókkal a PHCachingImageManager-en keresztül.
  • PHPhotoLibrary — belépési pont a módosítások végrehajtásához: médiaobjektumok létrehozása, törlése és szerkesztése.

Mi az a PhotoKit?

PhotoKit — Apple keretrendszer (az iOS 8-ban, macOS 10.11-ben bevezetve), amely objektumorientált API-t biztosít a rendszermédiatárral való munkához. Az AssetsLibrary-val ellentétben a PhotoKit adatbázisként kezeli a médiatárat: a lekérdezések PHAsset, PHCollection, PHCollectionList objektumokat adnak vissza, amelyek a tartalmat és a tárolási struktúrát reprezentálják.

A PhotoKit támogatja az összes médiatípust: fényképek (JPEG, HEIF, RAW), videók (MOV, MP4), Live Photos és sorozatfelvételek. A keretrendszer automatikusan kezeli az iCloud-szinkronizálást: ha a kép iCloud-ban van tárolva, a PhotoKit hálózaton keresztül kéri le, és jelenti a folyamatot a PHImageRequestOptions.progressHandler segítségével.

A PhotoKit legfontosabb jellemzője — a PHObject-ra épülő adatmodell lokális azonosítóval (localIdentifier), amely a munkamenetek között stabil marad. Ez lehetővé teszi a médiaobjektumokra való hivatkozások mentését és visszaállítását az alkalmazás újraindítása után újbóli lekérdezés nélkül.

Hogyan működik a PhotoKit: adatmodell és lekérdezések

A PhotoKit három szinten épül fel: adatmodell (PHObject), lekérdezések (PHFetchResult) és módosítások (PHPhotoLibrary.performChanges). Az adatmodell hierarchikus: a PHAsset (fénykép/videó) a PHAssetCollection (album) belsejében található, az albumok pedig PHCollectionList (mappa) csoportokba vannak rendezve.

Lekérdezések végrehajtása

A lekérdezések a PHAsset.fetchAssets és PHAssetCollection.fetchAssetCollections segítségével hajthatók végre. Az összes fetch metódus szinkron, és PHFetchResult-ot ad vissza, amelynek objektuma azonnal végrehajtja a lekérdezést a médiatár adatbázisában. A PHFetchResult támogatja a gyors index szerinti hozzáférést (object(at:)) és a felsorolást a enumerateObjects segítségével.

  • fetchAssets(with:options:) — az összes média lekérdezése típus, dátum, album szerinti szűréssel
  • fetchAssetCollections(with:subtype:options:) — albumok és mappák lekérdezése
  • fetchAssets(in:options:) — média lekérdezése egy adott albumon belül

PHFetchOptions

PHFetchOptions — objektum a lekérdezés konfigurálásához: rendezés (sortDescriptors), predikátum (predicate), rejtett és törölt média bevonása (includeHiddenAssets, includeAllBurstAssets). A fetch opciók lehetővé teszik a szűrést médiatípus szerint: PHAssetMediaType.image, .video, .audio.

A PhotoKit fő osztályai

A PhotoKit osztályok készletét tartalmazza a médiatár eléréséhez, lekérdezéséhez és módosításához. Mindegyikük megértése elengedhetetlen a keretrendszer hatékony használatához.

PHAsset

PHAsset — megváltoztathatatlan objektum, amely egyetlen médiatartalmat reprezentál. Metaadatokat tartalmaz: mediaType, mediaSubtypes, creationDate, location, pixelWidth, pixelHeight, duration (videó esetén), isFavorite, burstIdentifier. LocalIdentifier — stabil szöveges kulcs, amely az alkalmazás újraindítása után is elérhető.

PHAssetCollection

PHAssetCollection — médiacsoport: rendszeralbumok (Recents, Favorites, Selfies, Screenshots), felhasználói albumok vagy Moments (automatikusan csoportosítva idő és hely szerint). Attribútumok: localizedTitle, assetCollectionType, assetCollectionSubtype, startDate, endDate.

PHCollectionList

PHCollectionList — mappa, amely albumokat (PHAssetCollection) vagy más mappákat tartalmaz. Ritkán használatos, főként a hierarchia megjelenítésére a felhasználói felületen.

PHImageManager és gyorsítótárazás

A PhotoKit nem ad vissza UIImage-t közvetlenül a PHAsset-ből — a képet a PHImageManager-en keresztül kell lekérni. Ez garantálja, hogy a kép betöltése figyelembe veszi az iCloud-ot, a gyorsítótárazást és a kívánt méretet.

KomponensRendeltetésJellemző
PHImageManager.default()Szabványos menedzser egyszeri lekérdezésekhezNincs gyorsítótárazás a lekérdezések között
PHCachingImageManagerMenedzser előtöltéssel gyűjteményekhezstartCachingImages a gördülékeny görgetéshez
PHImageRequestOptionsLekérdezés beállításai: méret, mód, kézbesítéssynchronous, deliveryMode, progressHandler
PHImageRequestIDLekérdezés azonosítója megszakításhozcancelImageRequest(PHImageRequestID)

A PHImageManager három kézbesítési módot támogat: opportunistic (először kicsinyített verzió, majd teljes), highQualityFormat (csak teljes minőség) és fastFormat (leggyorsabb elérhető verzió). Gyűjtemények esetén mindig PHCachingImageManager-t használjon a látható cellák képének előtöltésével.

PhotoKit használati példák Swift-ben

A PhotoKit egyéni galériák, szerkesztők és médiaalkalmazások létrehozására szolgál. Vizsgáljunk meg három kulcsfontosságú forgatókönyvet.

Az összes fénykép lekérdezése a médiatárból

PHAsset.fetchAssets PHFetchOptions-szal és létrehozási dátum szerinti rendezéssel — alap lekérdezés egyéni fotógaléria építéséhez. A PHFetchResult támogatja a lusta betöltést és a folyamatos hozzáférést.

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("Találat: \(allPhotos.count) fénykép")

allPhotos.enumerateObjects { asset, index, stop in
    print("Fénykép \(index): \(asset.localIdentifier)")
}

PHFetchResult — szálbiztos tároló. Az objektumok index szerinti elérése az object(at:) segítségével nem blokkolja a UI-t, de a kép lekérése a PHImageManager-en keresztül aszinkron módon történjen.

Kép betöltése gyorsítótárazással

PHCachingImageManager — a PHImageManager alosztálya a startCachingImages és stopCachingImages metódusokkal az előtöltéshez. UICollectionView-ben használatos a gördülékeny görgetéshez.

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

// Előtöltés a látható cellákhoz
cachingManager.startCachingImages(
    for: visibleAssets,
    targetSize: targetSize,
    contentMode: .aspectFill,
    options: nil
)

// Kép lekérése PHImageRequestOptions segítségével iCloud fallback-kel
let requestOptions = PHImageRequestOptions()
requestOptions.deliveryMode = .opportunistic
requestOptions.isNetworkAccessAllowed = .true
requestOptions.progressHandler = { progress, error, stop, info in
    DispatchQueue.main.async {
        print("Letöltés iCloud-ból: \(progress * 100)%")
    }
}

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

A médiatár szerkesztése: hozzáadás a kedvencekhez

A médiatár módosításai a PHPhotoLibrary.shared().performChanges segítségével történnek a changeRequest blokkon belül. Minden művelet kötegelve és tranzakciósan kerül alkalmazásra.

swift
PHPhotoLibrary.shared().performChanges {
    let changeRequest = PHAssetChangeRequest(for: asset)
    changeRequest.isFavorite = .true
} completionHandler: { success, error in
    if success {
        print("Hozzáadva a kedvencekhez")
    }
}

Változások és megfigyelés a Change Tracking segítségével

A PhotoKit megfigyelési mechanizmust biztosít a médiatár változásainak nyomon követésére a PHPhotoLibraryChangeObserver protokollon keresztül. Bármilyen változásnál (létrehozás, törlés, szerkesztés) meghívásra kerül a photoLibraryDidChange metódus egy PHChange objektummal.

A PHChange changeDetails-t tartalmaz minden lekérdezéstípushoz: PHFetchResultChangeDetails removedIndexes, insertedIndexes, changedIndexes mezőkkel. Ez lehetővé teszi a változtatások animált alkalmazását a UI-ban: performBatchUpdates move, insert, delete műveletekkel UICollectionView esetén.

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
            // Változások alkalmazása a collectionView-ra
        }
    }
}

RAW szerkesztés és bővítmények

A PhotoKit támogatja a média szerkesztését a PHContentEditingInput és PHContentEditingOutput mechanizmuson keresztül. Az alkalmazás editingInput-ot kér az eredeti adatokkal, alkalmazza a változtatásokat, és elmenti az eredményt az editingOutput-on keresztül. A keretrendszer automatikusan megőrzi az eredetit, lehetővé téve a felhasználónak a módosítások visszavonását az eredeti állapot visszaállításával.

A RAW fényképek (DNG, CR2, NEF) a PHAssetResourceManager-en keresztül támogatottak, amely hozzáférést biztosít az eredeti RAW fájlhoz. A RAW feldolgozásához ajánlott a CoreImage használata a CIRAWFilter szűrővel, amely támogatja a hőmérséklet, expozíció és élesség beállítását. A PhotoKit támogatja a szerkesztő bővítményeket is a Photo Editing Extension (iOS) segítségével — az alkalmazás meghívható a rendszerszerkesztőből a kiválasztott fénykép vagy videó feldolgozásához.

A PhotoKit használatának optimalizálása

PhotoKit — egy erőteljes, de erőforrás-igényes keretrendszer. A helytelen használat lassuláshoz vezethet görgetéskor és túlzott memóriahasználathoz. Kövesse az ajánlásokat az optimális teljesítmény érdekében.

  • Használjon PHCachingImageManager-t gyűjteményekhez — a látható +-1 képernyő cellák képének előtöltése megszünteti a késéseket görgetéskor
  • Állítson be targetSize-t — soha ne kérje a PHImageManagerMaximumSize-t bélyegképekhez. Használjon a cella fizikai méretével megegyező méretet szorozva a képernyő scale-ével
  • Szakítsa meg a lekérdezéseket a cella újrafelhasználásakor — mentse el a PHImageRequestID-t és hívja meg a cancelImageRequest-et a prepareForReuse-ben
  • Korlátozza az iCloud lekérdezéseket — gyors görgetéskor állítsa be az isNetworkAccessAllowed = false értéket, és csak megálláskor töltse be az iCloud fényképeket
  • Gyorsítótárazza a PHFetchResult-ot — az ismételt fetchAssets ugyanazokkal az opciókkal új PHFetchResult-ot ad vissza. Tárolja az eredményt egy tulajdonságban, és frissítse a Change Observer segítségével

PHLivePhoto — külön lekérdezést igényel a PHLivePhoto.request(with:targetSize:contentMode:options:resultHandler:) segítségével. Ne kérjen Live Photo-t olyan cellákhoz, ahol csak fénykép jelenik meg — használja a PHLivePhotoBadge-et jelzéshez.

Gyakran ismételt kérdések

Mi az a PhotoKit és miben különbözik az AssetsLibrary-tól?

PhotoKit — egy modern Apple keretrendszer a médiatárral való munkához, bevezetve az iOS 8-ban. Az elavult AssetsLibrary-val ellentétben a PhotoKit PHAsset objektummodellt, PHFetchResult-ot gyors kereséssel, iCloud támogatást és Change Tracking-et biztosít a változások megfigyeléséhez.

Hogyan kérek hozzáférést a médiatárhoz a PhotoKit-en keresztül?

Hívja meg a PHPhotoLibrary.requestAuthorization(for: .readWrite) függvényt callback kezeléssel. A .authorized státusz megszerzése után végrehajthatók a PHAsset.fetchAssets lekérdezések. Íráshoz .readWrite hozzáférés szükséges. Csak olvasáshoz — .addOnly.

Hogyan kapok képet a PHAsset-ből?

Használja a PHImageManager.default().requestImage függvényt a következő paraméterekkel: asset, targetSize, contentMode és PHImageRequestOptions. Az aszinkron metódus PHImageRequestID-t ad vissza, lehetővé téve a lekérdezés megszakítását. Gyűjteményekhez használjon PHCachingImageManager-t előtöltéssel.

Hogyan követem nyomon a változásokat a médiatárban?

Regisztrálja a megfigyelőt a PHPhotoLibrary.shared().register(self) segítségével, és implementálja a PHPhotoLibraryChangeObserver protokollt. A photoLibraryDidChange metódusban PHChange objektumot kap changeDetails-szel minden fetchResult-hoz, és alkalmazza a változtatásokat a UI-ban animációval.

Hogyan kezeljem az iCloud fényképeket a PhotoKit-ben?

A PHImageRequestOptions-ban állítsa be az isNetworkAccessAllowed = true értéket és a progressHandler-t az iCloud-ból történő betöltés nyomon követéséhez. Gyors görgetéskor kapcsolja ki a hálózati hozzáférést, és csak a helyi verziókat töltse be a görgetési késések elkerülése érdekében.

Összefoglalás

  • PhotoKit — Apple keretrendszer a médiatárral való munkához, amely felváltotta az AssetsLibrary-t az iOS 8 és macOS 10.11 óta.
  • PHAsset — az alapvető adatmodell lokális azonosítóval, típussal, dátummal, hellyel és mérettel.
  • PHFetchResult szinkron lekérdezést hajt végre a tárolóban, és szálbiztos hozzáférést biztosít az eredményekhez.
  • PHCachingImageManager előtöltéssel gördülékeny görgetést biztosít a gyűjteményekben késés nélkül.
  • Change Tracking a PHPhotoLibraryChangeObserver-en keresztül lehetővé teszi a UI számára, hogy azonnal reagáljon a médiatár változásaira.
  • iCloud szinkronizálás beépítve a keretrendszerbe: a kép lekérése automatikusan betölti azt az iCloud-ból folyamatjelzéssel.
  • Optimalizálás — megfelelő targetSize, lekérdezések megszakítása és iCloud korlátozás görgetéskor kritikus a teljesítmény szempontjából.

Kulcsrakész mobilalkalmazást fejlesztünk

Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.

Projekt megbeszélése

Olvassa el is