PhotoKit — bu nima, asosiy tushunchalar va PHAsset

Muallif: IT Sectr Nashr etilgan: 2026-05-06 O'qish vaqti: 8 daq

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 — tizim media kutubxonasi bilan ishlash uchun Apple framework-i, fotosuratlar, videolar, Live Photos va albomlarga kirishni ta'minlaydi.
  • PHAsset — bitta media tarkibini (foto yoki video) metadata bilan ifodalovchi data modeli: sana, joy, tur.
  • PHFetchResult — so'rov natijalari konteyneri, oqimli yuklash va PHPhotoLibraryChangeObserver orqali o'zgarish bildirishnomalari bilan.
  • PHImageManager — PHCachingImageManager orqali o'lcham, rejim va keshlash variantlari bilan tasvirlarni olish menejeri.
  • PHPhotoLibrary — o'zgarishlarni amalga oshirish uchun kirish nuqtasi: media obyektlarini yaratish, o'chirish va tahrirlash.

PhotoKit nima?

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 qanday ishlaydi: data modeli va so'rovlar

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'rovlarni bajarish

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.

  • fetchAssets(with:options:) — tur, sana, albom bo'yicha filtrlash bilan barcha media so'rovi
  • fetchAssetCollections(with:subtype:options:) — albom va papkalar so'rovi
  • fetchAssets(in:options:) — aniq bir albom ichidagi media so'rovi

PHFetchOptions

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-ning asosiy sinflari

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

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

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

PHCollectionList — albomlarni (PHAssetCollection) yoki boshqa papkalarni o'z ichiga olgan papka. Kamdan-kam qo'llaniladi, asosan foydalanuvchi interfeysida iyerarxiyani ko'rsatish uchun.

PHImageManager va keshlash

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.

KomponentVazifasiXususiyati
PHImageManager.default()Yakka so'rovlar uchun standart menejerSo'rovlar orasida keshlash yo'q
PHCachingImageManagerKollektsiyalar uchun oldindan yuklash bilan menejerSilliq skroll uchun startCachingImages
PHImageRequestOptionsSo'rov sozlamalari: o'lcham, rejim, yetkazishsynchronous, deliveryMode, progressHandler
PHImageRequestIDBekor qilish uchun so'rov identifikatoricancelImageRequest(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.

Swift-da PhotoKit dan foydalanish misollari

PhotoKit maxsus galereyalar, muharrirlar va media bilan ishlash ilovalarini yaratish uchun ishlatiladi. Uchta asosiy stsenariyni ko'rib chiqamiz.

Media kutubxonasidan barcha fotosuratlarni so'rash

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.

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("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.

Keshlash bilan tasvir yuklash

PHCachingImageManager — oldindan yuklash uchun startCachingImages va stopCachingImages metodlari bilan PHImageManager-ning pastki sinfi. UICollectionView-da silliq skroll uchun ishlatiladi.

swift
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 kutubxonasini tahrirlash: sevimlilarga qo'shish

Media kutubxonasidagi o'zgarishlar changeRequest bloki ichida PHPhotoLibrary.shared().performChanges orqali bajariladi. Barcha operatsiyalar to'planadi va tranzaksiya shaklida qo'llaniladi.

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

Change Tracking orqali o'zgarishlar va kuzatish

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.

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
            // O'zgarishlarni collectionView ga qo'llash
        }
    }
}

RAW tahrirlash va kengaytmalar

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 bilan ishlashni optimallashtirish

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.

  • PHCachingImageManager dan foydalaning kollektsiyalar uchun — ko'rinadigan +-1 ekran kataklar uchun tasvirlarni oldindan yuklash skroll paytidagi kechikishlarni bartaraf qiladi
  • targetSize-ni belgilang — miniaturalar uchun hech qachon PHImageManagerMaximumSize-ni so'ramang. Ekran scale-iga ko'paytirilgan katakning fizik o'lchamiga teng o'lchamdan foydalaning
  • So'rovlarni bekor qiling katak qayta ishlatilganda — PHImageRequestID-ni saqlang va prepareForReuse-da cancelImageRequest-ni chaqiring
  • iCloud so'rovlarini cheklang — tez skroll paytida isNetworkAccessAllowed = false o'rnating va iCloud fotosuratlarini faqat to'xtash vaqtida yuklang
  • PHFetchResult-ni keshlang — bir xil variantlar bilan takroriy fetchAssets yangi PHFetchResult qaytaradi. Natijani xususiyatda saqlang va Change Observer orqali yangilang

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 nima va u AssetsLibrary-dan nimasi bilan farq qiladi?

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.

PhotoKit orqali media kutubxonasiga kirishni qanday so'rash mumkin?

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.

PHAsset-dan tasvirni qanday olish mumkin?

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.

Media kutubxonasidagi o'zgarishlarni qanday kuzatish mumkin?

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.

PhotoKit-da iCloud fotosuratlarini qanday qayta ishlash mumkin?

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

  • PhotoKit — iOS 8 va macOS 10.11 dan boshlab AssetsLibrary o'rnini egallagan media kutubxonasi bilan ishlash uchun Apple framework-i.
  • PHAsset — lokal identifikator, tur, sana, joy va o'lcham bilan asosiy data modeli.
  • PHFetchResult saqlashga sinxron so'rovni bajaradi va natijalarga thread-safe kirishni ta'minlaydi.
  • PHCachingImageManager oldindan yuklash bilan kollektsiyalarda kechikishlarsiz silliq skrollni ta'minlaydi.
  • Change Tracking PHPhotoLibraryChangeObserver orqali UI-ning media kutubxonasidagi o'zgarishlarga darhol reaksiya berishiga imkon beradi.
  • iCloud sinxronizatsiyasi framework-ga o'rnatilgan: tasvir so'rovi avtomatik ravishda iCloud-dan taraqqiyot bilan yuklanadi.
  • Optimallashtirish — to'g'ri targetSize, so'rovlarni bekor qilish va skroll paytida iCloud-ni cheklash ishlash uchun muhimdir.

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.

Loyihani muhokama qilish

Shuningdek o'qing