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 (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.
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.
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.
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 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 — 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 — 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 — 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.
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.
| Komponens | Rendeltetés | Jellemző |
|---|---|---|
| PHImageManager.default() | Szabványos menedzser egyszeri lekérdezésekhez | Nincs gyorsítótárazás a lekérdezések között |
| PHCachingImageManager | Menedzser előtöltéssel gyűjteményekhez | startCachingImages a gördülékeny görgetéshez |
| PHImageRequestOptions | Lekérdezés beállításai: méret, mód, kézbesítés | synchronous, deliveryMode, progressHandler |
| PHImageRequestID | Lekérdezés azonosítója megszakításhoz | cancelImageRequest(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.
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.
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.
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.
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.
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 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.
PHPhotoLibrary.shared().performChanges {
let changeRequest = PHAssetChangeRequest(for: asset)
changeRequest.isFavorite = .true
} completionHandler: { success, error in
if success {
print("Hozzáadva a kedvencekhez")
}
}
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.
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
}
}
}
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.
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.
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
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.
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.
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.
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.
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
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.
Olvassa el is