PhotoKit — iOS va macOS-da media kutubxonasi bilan ishlash uchun Apple framework-i bo'lib, qurilmadagi fotosuratlar, videolar va Live Photos-ga to'g'ridan-to'g'ri kirishni ta'minlaydi. Apple hujjatlariga ko'ra, framework eskirgan AssetsLibrary o'rnini egallaydi va iCloud, albomlar, tahrirlash va Change Tracking-ni qo'llab-quvvatlaydi. PhotoKit so'rovlar, keshlash va media kutubxonasidagi o'zgarishlar uchun yagona API-ni ta'minlaydi, iCloud orqali avtomatik sinxronizatsiya bilan.
Asosiy fikrlar
PhotoKit — Apple framework-i (iOS 8, macOS 10.11 da taqdim etilgan), tizim media kutubxonasi bilan ishlash uchun obyektga yo'naltirilgan API-ni ta'minlaydi. AssetsLibrary-dan farqli o'laroq, PhotoKit media kutubxonasi bilan ma'lumotlar bazasi kabi ishlaydi: so'rovlar tarkib va saqlash strukturasini ifodalovchi PHAsset, PHCollection, PHCollectionList obyektlarini qaytaradi.
PhotoKit barcha media turlarini qo'llab-quvvatlaydi: fotosuratlar (JPEG, HEIF, RAW), videolar (MOV, MP4), Live Photos va seriyali suratlar. Framework avtomatik ravishda iCloud sinxronizatsiyasini boshqaradi: agar tasvir iCloud-da saqlansa, PhotoKit uni tarmoq orqali so'raydi va PHImageRequestOptions.progressHandler orqali taraqqiyot haqida xabar beradi.
PhotoKit-ning asosiy xususiyati — sessiyalar orasida barqaror qoladigan lokal identifikator (localIdentifier) bilan PHObject-ga asoslangan data modelidir. Bu media obyektlariga havolalarni saqlash va qayta so'rovsiz ilova qayta ishga tushirilgandan keyin ularni tiklash imkonini beradi.
PhotoKit uch darajada qurilgan: data modeli (PHObject), so'rovlar (PHFetchResult) va o'zgarishlar (PHPhotoLibrary.performChanges). Data modeli iyerarxik: PHAsset (foto/video) PHAssetCollection (albom) ichida, albomlar esa PHCollectionList (papka) ichida guruhlanadi.
So'rovlar PHAsset.fetchAssets va PHAssetCollection.fetchAssetCollections orqali bajariladi. Barcha fetch metodlari sinxron bo'lib, darhol media kutubxonasi ma'lumotlar bazasiga so'rovni bajaruvchi PHFetchResult obyektini qaytaradi. PHFetchResult indeks bo'yicha tezkor kirishni (object(at:)) va enumerateObjects orqali sanashni qo'llab-quvvatlaydi.
PHFetchOptions — so'rovni sozlash obyekti: saralash (sortDescriptors), predikat (predicate), yashirin va o'chirilgan medialarni kiritish (includeHiddenAssets, includeAllBurstAssets). Fetch variantlari media turi bo'yicha filtrlash imkonini beradi: PHAssetMediaType.image, .video, .audio.
PhotoKit media kutubxonasiga kirish, so'rov va o'zgartirish uchun sinflar to'plamini o'z ichiga oladi. Ularning har birini tushunish framework bilan samarali ishlash uchun zarur.
PHAsset — bitta media tarkibini ifodalovchi o'zgarmas obyekt. Metadatalarni o'z ichiga oladi: mediaType, mediaSubtypes, creationDate, location, pixelWidth, pixelHeight, duration (video uchun), isFavorite, burstIdentifier. LocalIdentifier — ilova qayta ishga tushirilgandan keyin ham mavjud bo'lgan barqaror matnli kalit.
PHAssetCollection — media guruhi: tizim albomlari (Recents, Favorites, Selfies, Screenshots), foydalanuvchi albomlari yoki Moments (vaqt va joy bo'yicha avtomatik guruhlangan). Atributlar: localizedTitle, assetCollectionType, assetCollectionSubtype, startDate, endDate.
PHCollectionList — albomlarni (PHAssetCollection) yoki boshqa papkalarni o'z ichiga olgan papka. Kamdan-kam qo'llaniladi, asosan foydalanuvchi interfeysida iyerarxiyani ko'rsatish uchun.
PhotoKit UIImage-ni to'g'ridan-to'g'ri PHAsset-dan qaytarmaydi — tasvirni PHImageManager orqali so'rash kerak. Bu tasvirning iCloud, keshlash va talab qilinadigan o'lchamni hisobga olgan holda yuklanishini kafolatlaydi.
| Komponent | Vazifasi | Xususiyati |
|---|---|---|
| PHImageManager.default() | Yakka so'rovlar uchun standart menejer | So'rovlar orasida keshlash yo'q |
| PHCachingImageManager | Kollektsiyalar uchun oldindan yuklash bilan menejer | Silliq skroll uchun startCachingImages |
| PHImageRequestOptions | So'rov sozlamalari: o'lcham, rejim, yetkazish | synchronous, deliveryMode, progressHandler |
| PHImageRequestID | Bekor qilish uchun so'rov identifikatori | cancelImageRequest(PHImageRequestID) |
PHImageManager uchta yetkazish rejimini qo'llab-quvvatlaydi: opportunistic (avval kichraytirilgan versiya, keyin to'liq), highQualityFormat (faqat to'liq sifat) va fastFormat (eng tez mavjud versiya). Kollektsiyalar uchun doimo ko'rinadigan kataklar uchun oldindan tasvir yuklash bilan PHCachingImageManager-dan foydalaning.
PhotoKit maxsus galereyalar, muharrirlar va media bilan ishlash ilovalarini yaratish uchun ishlatiladi. Uchta asosiy stsenariyni ko'rib chiqamiz.
PHAsset.fetchAssets PHFetchOptions va yaratilish sanasi bo'yicha saralash bilan — maxsus foto galereyani qurish uchun asosiy so'rov. PHFetchResult lazy-loading va oqimli kirishni qo'llab-quvvatlaydi.
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("Topildi \(allPhotos.count) fotosurat")
allPhotos.enumerateObjects { asset, index, stop in
print("Fotosurat \(index): \(asset.localIdentifier)")
}
PHFetchResult — thread-safe konteyner. Obyektlarga object(at:) orqali indeks bo'yicha kirish UI-ni bloklamaydi, lekin PHImageManager orqali tasvir so'rovi asinxron bajarilishi kerak.
PHCachingImageManager — oldindan yuklash uchun startCachingImages va stopCachingImages metodlari bilan PHImageManager-ning pastki sinfi. UICollectionView-da silliq skroll uchun ishlatiladi.
let cachingManager = PHCachingImageManager()
let targetSize = CGSize(width: 200, height: 200)
// Ko'rinadigan kataklar uchun oldindan yuklash
cachingManager.startCachingImages(
for: visibleAssets,
targetSize: targetSize,
contentMode: .aspectFill,
options: nil
)
// PHImageRequestOptions orqali iCloud fallback bilan tasvir so'rovi
let requestOptions = PHImageRequestOptions()
requestOptions.deliveryMode = .opportunistic
requestOptions.isNetworkAccessAllowed = .true
requestOptions.progressHandler = { progress, error, stop, info in
DispatchQueue.main.async {
print("iCloud-dan yuklanmoqda: \(progress * 100)%")
}
}
let requestID = cachingManager.requestImage(
for: asset,
targetSize: targetSize,
contentMode: .aspectFill,
options: requestOptions
) { image, info in
print("Tasvir olindi: \(image?.size ?? .zero)")
}
Media kutubxonasidagi o'zgarishlar changeRequest bloki ichida PHPhotoLibrary.shared().performChanges orqali bajariladi. Barcha operatsiyalar to'planadi va tranzaksiya shaklida qo'llaniladi.
PHPhotoLibrary.shared().performChanges {
let changeRequest = PHAssetChangeRequest(for: asset)
changeRequest.isFavorite = .true
} completionHandler: { success, error in
if success {
print("Sevimlilarga qo'shildi")
}
}
PhotoKit PHPhotoLibraryChangeObserver protokoli orqali media kutubxonasidagi o'zgarishlarni kuzatish mexanizmini ta'minlaydi. Har qanday o'zgarishda (yaratish, o'chirish, tahrirlash) PHChange obyekti bilan photoLibraryDidChange metodi chaqiriladi.
PHChange har bir so'rov turi uchun changeDetails-ni o'z ichiga oladi: PHFetchResultChangeDetails removedIndexes, insertedIndexes, changedIndexes bilan. Bu UI-da o'zgarishlarni animatsiya bilan qo'llash imkonini beradi: UICollectionView uchun move, insert, delete bilan performBatchUpdates.
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
// O'zgarishlarni collectionView ga qo'llash
}
}
}
PhotoKit PHContentEditingInput va PHContentEditingOutput mexanizmi orqali media tahrirlashni qo'llab-quvvatlaydi. Ilova asl ma'lumotlar bilan editingInput-ni so'raydi, o'zgarishlarni qo'llaydi va natijani editingOutput orqali saqlaydi. Framework avtomatik ravishda asl nusxani saqlaydi, foydalanuvchiga asl nusxaga qaytarish orqali o'zgarishlarni bekor qilish imkonini beradi.
RAW fotosuratlar (DNG, CR2, NEF) PHAssetResourceManager orqali qo'llab-quvvatlanadi, asl RAW fayliga kirishni ta'minlaydi. RAW-ni qayta ishlash uchun harorat, ekspozitsiya va aniqlikni sozlashni qo'llab-quvvatlovchi CIRAWFilter filtri bilan CoreImage-dan foydalanish tavsiya etiladi. PhotoKit shuningdek Photo Editing Extension (iOS) orqali muharrir kengaytmalarini qo'llab-quvvatlaydi — ilova tanlangan foto yoki videoni qayta ishlash uchun tizim muharriridan chaqirilishi mumkin.
PhotoKit — kuchli, ammo resurs talab qiladigan framework. Noto'g'ri foydalanish skroll paytida sekinlashishga va ortiqcha xotira sarfiga olib kelishi mumkin. Optimal ishlash uchun tavsiyalarga amal qiling.
PHLivePhoto — PHLivePhoto.request(with:targetSize:contentMode:options:resultHandler:) orqali alohida so'rov talab qiladi. Faqat fotosurat ko'rsatiladigan kataklar uchun Live Photo so'ramang — ko'rsatish uchun PHLivePhotoBadge-dan foydalaning.
Ko'p beriladigan savollar
PhotoKit — iOS 8 da taqdim etilgan media kutubxonasi bilan ishlash uchun zamonaviy Apple framework-i. Eskirgan AssetsLibrary-dan farqli o'laroq, PhotoKit PHAsset obyekt modeli, tezkor qidiruv bilan PHFetchResult, iCloud qo'llab-quvvatlash va o'zgarishlarni kuzatish uchun Change Tracking-ni ta'minlaydi.
PHPhotoLibrary.requestAuthorization(for: .readWrite) ni callback bilan chaqiring. .authorized statusini olgandan so'ng PHAsset.fetchAssets so'rovlarini bajarish mumkin. Yozish uchun .readWrite kirishi talab qilinadi. Faqat o'qish uchun — .addOnly.
PHImageManager.default().requestImage dan parametrlar bilan foydalaning: asset, targetSize, contentMode va PHImageRequestOptions. Asinxron metod so'rovni bekor qilish imkonini beruvchi PHImageRequestID-ni qaytaradi. Kollektsiyalar uchun oldindan yuklash bilan PHCachingImageManager-dan foydalaning.
PHPhotoLibrary.shared().register(self) orqali kuzatuvchini ro'yxatdan o'tkazing va PHPhotoLibraryChangeObserver protokolini amalga oshiring. photoLibraryDidChange metodida har bir fetchResult uchun changeDetails bilan PHChange-ni oling va o'zgarishlarni UI-da animatsiya bilan qo'llang.
PHImageRequestOptions-da isNetworkAccessAllowed = true va iCloud-dan yuklashni kuzatish uchun progressHandler-ni o'rnating. Tez skroll paytida tarmoq kirishini o'chiring va kechikishlarning oldini olish uchun faqat lokal versiyalarni yuklang.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.