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 — 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 üç 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 PHAsset.fetchAssets və PHAssetCollection.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.
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 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 — 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 — 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 — 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.
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.
| Komponent | Təyinat | Xüsusiyyət |
|---|---|---|
| PHImageManager.default() | Tək sorğular üçün standart menecer | Sorğular arasında keşləmə yoxdur |
| PHCachingImageManager | Kolleksiyalar üçün əvvəlcədən yükləmə ilə menecer | Hamar skroll üçün startCachingImages |
| PHImageRequestOptions | Sorğu parametrləri: ölçü, rejim, çatdırılma | synchronous, deliveryMode, progressHandler |
| PHImageRequestID | Ləğv etmək üçün sorğu identifikatoru | cancelImageRequest(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.
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.
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.
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.
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.
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ı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.
PHPhotoLibrary.shared().performChanges {
let changeRequest = PHAssetChangeRequest(for: asset)
changeRequest.isFavorite = .true
} completionHandler: { success, error in
if success {
print("Seçilmişlərə əlavə edildi")
}
}
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.
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
}
}
}
PhotoKit PHContentEditingInput və PHContentEditingOutput 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 — 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.
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 — 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.
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.
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.
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.
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ə
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.
Həm də oxuyun