PhotoKit — bu nədir, əsas anlayışlar və PHAsset

Müəllif: IT Sectr Dərc olunub: 2026-05-06 Oxuma vaxtı: 8 dəq

PhotoKit — iOS və macOS-da media kitabxanası ilə işləmək üçün Apple framework-üdür, cihazdakı foto, video və Live Photos-a birbaşa çıxış təmin edir. Apple sənədlərinə görə, framework köhnəlmiş AssetsLibrary-i əvəz edir və iCloud, albomlar, redaktə və Change Tracking-i dəstəkləyir. PhotoKit sorğular, keşləmə və media kitabxanasında dəyişikliklər üçün vahid API təmin edir, iCloud vasitəsilə avtomatik sinxronizasiya ilə.

Əsas məqamlar

  • PhotoKit — sistem media kitabxanası ilə işləmək üçün Apple framework-ü, foto, video, Live Photos və albomlara çıxış təmin edir.
  • PHAsset — tək bir media məzmununu (foto və ya video) metadata ilə təmsil edən data modeli: tarix, yer, tip.
  • PHFetchResult — sorğu nəticələri konteyneri, axın yükləməsi və PHPhotoLibraryChangeObserver vasitəsilə dəyişiklik bildirişləri ilə.
  • PHImageManager — PHCachingImageManager vasitəsilə ölçü, rejim və keşləmə seçimləri ilə şəkilləri əldə etmək üçün menecer.
  • PHPhotoLibrary — dəyişikliklərin aparılması üçün giriş nöqtəsi: media obyektlərinin yaradılması, silinməsi və redaktəsi.

PhotoKit nədir?

PhotoKit — Apple framework-ü (iOS 8, macOS 10.11-də təqdim edilib), sistem media kitabxanası ilə işləmək üçün obyekt yönümlü API təmin edir. AssetsLibrary-dən fərqli olaraq, PhotoKit media kitabxanası ilə verilənlər bazası kimi işləyir: sorğular məzmunu və saxlama strukturunu təmsil edən PHAsset, PHCollection, PHCollectionList obyektlərini qaytarır.

PhotoKit bütün media növlərini dəstəkləyir: fotoşəkillər (JPEG, HEIF, RAW), videolar (MOV, MP4), Live Photos və seriya çəkilişləri. Framework avtomatik olaraq iCloud sinxronizasiyasını idarə edir: şəkil iCloud-da saxlanılırsa, PhotoKit onu şəbəkə vasitəsilə sorğulayır və PHImageRequestOptions.progressHandler vasitəsilə irəliləyiş barədə məlumat verir.

PhotoKit-in əsas xüsusiyyəti — sessiyalar arasında sabit qalan lokal identifikator (localIdentifier) ilə PHObject-ə əsaslanan data modelidir. Bu, media obyektlərinə istinadları saxlamağa və təkrar sorğu olmadan tətbiq yenidən başladıldıqdan sonra onları bərpa etməyə imkan verir.

PhotoKit necə işləyir: data modeli və sorğular

PhotoKit üç səviyyədə qurulub: data modeli (PHObject), sorğular (PHFetchResult) və dəyişikliklər (PHPhotoLibrary.performChanges). Data modeli iyerarxikdir: PHAsset (foto/video) PHAssetCollection (albom) daxilində, albomlar isə PHCollectionList (qovluq) daxilində qruplaşdırılır.

Sorğuların icrası

Sorğular PHAsset.fetchAssetsPHAssetCollection.fetchAssetCollections vasitəsilə icra olunur. Bütün fetch metodları sinxrondur və dərhal media kitabxanası verilənlər bazasına sorğu icra edən PHFetchResult obyektini qaytarır. PHFetchResult indeks üzrə sürətli çıxışı (object(at:)) və enumerateObjects vasitəsilə sadalamağı dəstəkləyir.

  • fetchAssets(with:options:) — tip, tarix, albom üzrə filtrasiya ilə bütün media sorğusu
  • fetchAssetCollections(with:subtype:options:) — albom və qovluqların sorğusu
  • fetchAssets(in:options:) — konkret albom daxilində media sorğusu

PHFetchOptions

PHFetchOptions — sorğu konfiqurasiyası üçün obyekt: sıralama (sortDescriptors), predikat (predicate), gizli və silinmiş medianın daxil edilməsi (includeHiddenAssets, includeAllBurstAssets). Fetch seçimləri media növünə görə filtrləməyə imkan verir: PHAssetMediaType.image, .video, .audio.

PhotoKit-in əsas sinifləri

PhotoKit media kitabxanasına çıxış, sorğu və dəyişiklik üçün siniflər dəsti daxildir. Onların hər birini başa düşmək framework ilə effektiv iş üçün vacibdir.

PHAsset

PHAsset — tək bir media məzmununu təmsil edən dəyişməz obyekt. Metadatanı ehtiva edir: mediaType, mediaSubtypes, creationDate, location, pixelWidth, pixelHeight, duration (video üçün), isFavorite, burstIdentifier. LocalIdentifier — tətbiq yenidən başladıldıqdan sonra da əlçatan olan sabit sətir açarı.

PHAssetCollection

PHAssetCollection — media qrupu: sistem albomları (Recents, Favorites, Selfies, Screenshots), istifadəçi albomları və ya Moments (vaxt və yerə görə avtomatik qruplaşdırılmış). Atributlar: localizedTitle, assetCollectionType, assetCollectionSubtype, startDate, endDate.

PHCollectionList

PHCollectionList — albomları (PHAssetCollection) və ya digər qovluqları ehtiva edən qovluq. Nadir hallarda, əsasən istifadəçi interfeysində iyerarxiyanı göstərmək üçün istifadə olunur.

PHImageManager və keşləmə

PhotoKit UIImage-i birbaşa PHAsset-dən qaytarmır — şəkli PHImageManager vasitəsilə sorğulamaq lazımdır. Bu, şəklin iCloud, keşləmə və tələb olunan ölçü nəzərə alınmaqla yüklənməsinə zəmanət verir.

KomponentTəyinatXüsusiyyət
PHImageManager.default()Tək sorğular üçün standart menecerSorğular arasında keşləmə yoxdur
PHCachingImageManagerKolleksiyalar üçün əvvəlcədən yükləmə ilə menecerHamar skroll üçün startCachingImages
PHImageRequestOptionsSorğu parametrləri: ölçü, rejim, çatdırılmasynchronous, deliveryMode, progressHandler
PHImageRequestIDLəğv etmək üçün sorğu identifikatorucancelImageRequest(PHImageRequestID)

PHImageManager üç çatdırılma rejimini dəstəkləyir: opportunistic (əvvəlcə kiçildilmiş versiya, sonra tam), highQualityFormat (yalnız tam keyfiyyət) və fastFormat (ən sürətli mövcud versiya). Kolleksiyalar üçün həmişə görünən xanalar üçün əvvəlcədən şəkil yükləmə ilə PHCachingImageManager-dən istifadə edin.

Swift-də PhotoKit istifadə nümunələri

PhotoKit fərdi qalereyalar, redaktorlar və media ilə işləmək üçün tətbiqlər yaratmaqda istifadə olunur. Üç əsas ssenarini nəzərdən keçirək.

Media kitabxanasından bütün fotoşəkillərin sorğusu

PHAsset.fetchAssets PHFetchOptions və yaradılma tarixinə görə sıralama ilə — fərdi foto qalereyası qurmaq üçün əsas sorğu. PHFetchResult lazy-loading və axın çıxışını dəstəkləyir.

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("Tapıldı \(allPhotos.count) şəkil")

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

PHFetchResult — thread-safe konteyner. Obyektlərə object(at:) vasitəsilə indeks üzrə çıxış UI-ni bloklamır, lakin PHImageManager vasitəsilə şəkil sorğusu asinxron icra olunmalıdır.

Keşləmə ilə şəkil yükləmə

PHCachingImageManager — əvvəlcədən yükləmə üçün startCachingImages və stopCachingImages metodları ilə PHImageManager-in alt sinfi. UICollectionView-də hamar skroll üçün istifadə olunur.

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

// Görünən xanalar üçün əvvəlcədən yükləmə
cachingManager.startCachingImages(
    for: visibleAssets,
    targetSize: targetSize,
    contentMode: .aspectFill,
    options: nil
)

// PHImageRequestOptions ilə iCloud fallback vasitəsilə şəkil sorğusu
let requestOptions = PHImageRequestOptions()
requestOptions.deliveryMode = .opportunistic
requestOptions.isNetworkAccessAllowed = .true
requestOptions.progressHandler = { progress, error, stop, info in
    DispatchQueue.main.async {
        print("iCloud-dan yüklənir: \(progress * 100)%")
    }
}

let requestID = cachingManager.requestImage(
    for: asset,
    targetSize: targetSize,
    contentMode: .aspectFill,
    options: requestOptions
) { image, info in
    print("Şəkil alındı: \(image?.size ?? .zero)")
}

Media kitabxanasının redaktəsi: seçilmişlərə əlavə etmə

Media kitabxanasında dəyişikliklər changeRequest bloku daxilində PHPhotoLibrary.shared().performChanges vasitəsilə icra olunur. Bütün əməliyyatlar toplanır və tranzaksiya şəklində tətbiq edilir.

swift
PHPhotoLibrary.shared().performChanges {
    let changeRequest = PHAssetChangeRequest(for: asset)
    changeRequest.isFavorite = .true
} completionHandler: { success, error in
    if success {
        print("Seçilmişlərə əlavə edildi")
    }
}

Change Tracking vasitəsilə dəyişikliklər və müşahidə

PhotoKit PHPhotoLibraryChangeObserver protokolu vasitəsilə media kitabxanasında dəyişiklikləri müşahidə mexanizmini təmin edir. İstənilən dəyişiklikdə (yaratma, silmə, redaktə) PHChange obyekti ilə photoLibraryDidChange metodu çağırılır.

PHChange hər sorğu növü üçün changeDetails ehtiva edir: PHFetchResultChangeDetails removedIndexes, insertedIndexes, changedIndexes ilə. Bu, UI-də dəyişiklikləri animasiya ilə tətbiq etməyə imkan verir: UICollectionView üçün move, insert, delete ilə 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
            // Dəyişiklikləri collectionView-ə tətbiq et
        }
    }
}

RAW redaktəsi və genişlənmələr

PhotoKit PHContentEditingInputPHContentEditingOutput mexanizmi vasitəsilə media redaktəsini dəstəkləyir. Tətbiq orijinal məlumatlarla editingInput tələb edir, dəyişiklikləri tətbiq edir və nəticəni editingOutput vasitəsilə saxlayır. Framework avtomatik olaraq orijinalı saxlayır, istifadəçiyə orijinala sıfırlama vasitəsilə dəyişiklikləri geri qaytarmağa imkan verir.

RAW fotoşəkillər (DNG, CR2, NEF) PHAssetResourceManager vasitəsilə dəstəklənir, orijinal RAW faylına çıxış təmin edir. RAW emalı üçün temperatur, ekspozisiya və kəskinliyi tənzimləməyi dəstəkləyən CIRAWFilter filtri ilə CoreImage istifadə etmək tövsiyə olunur. PhotoKit həmçinin Photo Editing Extension (iOS) vasitəsilə redaktor genişlənmələrini dəstəkləyir — tətbiq seçilmiş foto və ya videonu emal etmək üçün sistem redaktorundan çağırıla bilər.

PhotoKit ilə işin optimallaşdırılması

PhotoKit — güclü, lakin resurs tutumlu framework. Düzgün istifadə edilmədikdə skroll zamanı ləngimələrə və həddindən artıq yaddaş istehlakına səbəb ola bilər. Optimal performans üçün tövsiyələrə əməl edin.

  • PHCachingImageManager istifadə edin kolleksiyalar üçün — görünən +-1 ekran xanalar üçün şəkillərin əvvəlcədən yüklənməsi skroll zamanı gecikmələri aradan qaldırır
  • targetSize təyin edin — miniaturalar üçün heç vaxt PHImageManagerMaximumSize tələb etməyin. Ekranın scale-ə vurulmuş xananın fiziki ölçüsünə bərabər ölçüdən istifadə edin
  • Sorğuları ləğv edin xana təkrar istifadə edildikdə — PHImageRequestID-ni saxlayın və prepareForReuse-də cancelImageRequest çağırın
  • iCloud sorğularını məhdudlaşdırın — sürətli skroll zamanı isNetworkAccessAllowed = false təyin edin və iCloud fotoşəkillərini yalnız dayanma zamanı yükləyin
  • PHFetchResult-u keşləyin — eyni seçimlərlə təkrar fetchAssets yeni PHFetchResult qaytarır. Nəticəni xassədə saxlayın və Change Observer vasitəsilə yeniləyin

PHLivePhoto — PHLivePhoto.request(with:targetSize:contentMode:options:resultHandler:) vasitəsilə ayrıca sorğu tələb edir. Yalnız foto göstərilən xanalar üçün Live Photo tələb etməyin — göstərmək üçün PHLivePhotoBadge istifadə edin.

Tez-tez verilən suallar

PhotoKit nədir və AssetsLibrary-dən nə fərqi var?

PhotoKit — iOS 8-də təqdim edilmiş media kitabxanası ilə işləmək üçün müasir Apple framework-ü. Köhnəlmiş AssetsLibrary-dən fərqli olaraq, PhotoKit PHAsset obyekt modeli, sürətli axtarış ilə PHFetchResult, iCloud dəstəyi və dəyişiklikləri müşahidə üçün Change Tracking təmin edir.

PhotoKit vasitəsilə media kitabxanasına girişi necə tələb etmək olar?

PHPhotoLibrary.requestAuthorization(for: .readWrite) çağırın callback emalı ilə. .authorized statusu aldıqdan sonra PHAsset.fetchAssets sorğularını icra etmək olar. Yazmaq üçün .readWrite girişi tələb olunur. Yalnız oxumaq üçün — .addOnly.

PHAsset-dən şəkli necə əldə etmək olar?

PHImageManager.default().requestImage istifadə edin parametrlərlə: asset, targetSize, contentMode və PHImageRequestOptions. Asinxron metod sorğunu ləğv etməyə imkan verən PHImageRequestID qaytarır. Kolleksiyalar üçün əvvəlcədən yükləmə ilə PHCachingImageManager istifadə edin.

Media kitabxanasında dəyişiklikləri necə izləmək olar?

PHPhotoLibrary.shared().register(self) vasitəsilə müşahidəçi qeydiyyatdan keçirin və PHPhotoLibraryChangeObserver protokolunu tətbiq edin. photoLibraryDidChange metodunda hər fetchResult üçün changeDetails ilə PHChange əldə edin və dəyişiklikləri UI-də animasiya ilə tətbiq edin.

PhotoKit-də iCloud fotoşəkillərini necə emal etmək olar?

PHImageRequestOptions-də isNetworkAccessAllowed = true və iCloud-dan yükləməni izləmək üçün progressHandler təyin edin. Sürətli skroll zamanı şəbəkə girişini söndürün və gecikmələrin qarşısını almaq üçün yalnız lokal versiyaları yükləyin.

Nəticə

  • PhotoKit — iOS 8 və macOS 10.11-dən etibarən AssetsLibrary-i əvəz edən media kitabxanası ilə işləmək üçün Apple framework-ü.
  • PHAsset — lokal identifikator, tip, tarix, yer və ölçü ilə əsas data modeli.
  • PHFetchResult anbara sinxron sorğu icra edir və nəticələrə thread-safe çıxış təmin edir.
  • PHCachingImageManager əvvəlcədən yükləmə ilə kolleksiyalarda gecikməsiz hamar skroll təmin edir.
  • Change Tracking PHPhotoLibraryChangeObserver vasitəsilə UI-nin media kitabxanasındakı dəyişikliklərə dərhal reaksiya verməsinə imkan verir.
  • iCloud sinxronizasiyası framework-ə daxildir: şəkil sorğusu avtomatik olaraq iCloud-dan irəliləyişlə yüklənir.
  • Optimallaşdırma — düzgün targetSize, sorğuların ləğvi və skroll zamanı iCloud-un məhdudlaşdırılması performans üçün kritikdir.

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun