PhotoKit — ay ang Apple framework para sa pagtatrabaho sa mediathèque sa iOS at macOS, na nagbibigay ng direktang access sa mga larawan, video, at Live Photos sa device. Ayon sa dokumentasyon ng Apple, pinapalitan ng framework ang lumang AssetsLibrary at sinusuportahan ang iCloud, mga album, pag-edit, at Change Tracking. PhotoKit ay nagbibigay ng pinag-isang API para sa mga query, caching, at mga pagbabago sa mediathèque na may awtomatikong pag-sync sa pamamagitan ng iCloud.
Mga Pangunahing Punto
PhotoKit — Apple framework (ipinakilala sa iOS 8, macOS 10.11), nagbibigay ng object-oriented API para sa pagtatrabaho sa system mediathèque. Hindi tulad ng AssetsLibrary, gumagana ang PhotoKit sa mediathèque bilang isang database: ang mga query ay nagbabalik ng mga object na PHAsset, PHCollection, PHCollectionList, na kumakatawan sa nilalaman at istraktura ng imbakan.
Sinusuportahan ng PhotoKit ang lahat ng uri ng media: mga larawan (JPEG, HEIF, RAW), video (MOV, MP4), Live Photos at serial shots. Awtomatikong pinamamahalaan ng framework ang iCloud sync: kung ang imahe ay naka-imbak sa iCloud, hinihiling ito ng PhotoKit sa pamamagitan ng network at nag-uulat ng progreso sa pamamagitan ng PHImageRequestOptions.progressHandler.
Ang pangunahing tampok ng PhotoKit — modelo ng data batay sa PHObject na may lokal na identifier (localIdentifier), na nananatiling matatag sa pagitan ng mga session. Ito ay nagpapahintulot sa pag-save ng mga reference sa media object at pagbawi ng mga ito pagkatapos ng restart ng app nang walang bagong query.
Ang PhotoKit ay binuo sa tatlong antas: modelo ng data (PHObject), mga query (PHFetchResult) at mga pagbabago (PHPhotoLibrary.performChanges). Ang modelo ng data ay hierarchical: ang PHAsset (larawan/video) ay nasa loob ng PHAssetCollection (album), ang mga album ay pinagsama-sama sa PHCollectionList (folder).
Ang mga query ay isinasagawa sa pamamagitan ng PHAsset.fetchAssets at PHAssetCollection.fetchAssetCollections. Ang lahat ng fetch method ay synchronous at nagbabalik ng PHFetchResult, na ang object ay agad na nagsasagawa ng query sa database ng mediathèque. Sinusuportahan ng PHFetchResult ang mabilis na access ayon sa index (object(at:)) at enumeration sa pamamagitan ng enumerateObjects.
PHFetchOptions — object para sa configuration ng query: pag-uuri (sortDescriptors), predicate, pagsasama ng nakatago at tinanggal na media (includeHiddenAssets, includeAllBurstAssets). Ang mga fetch option ay nagpapahintulot ng pag-filter ayon sa uri ng media: PHAssetMediaType.image, .video, .audio.
Ang PhotoKit ay may kasamang hanay ng mga klase para sa access, query, at pagbabago ng mediathèque. Ang pag-unawa sa bawat isa ay kinakailangan para sa epektibong pagtatrabaho sa framework.
PHAsset — hindi nababagong object na kumakatawan sa isang media content. Naglalaman ng metadata: mediaType, mediaSubtypes, creationDate, location, pixelWidth, pixelHeight, duration (para sa video), isFavorite, burstIdentifier. LocalIdentifier — matatag na text key, accessible kahit pagkatapos ng restart ng app.
PHAssetCollection — grupo ng media: system albums (Recents, Favorites, Selfies, Screenshots), user albums o Moments (awtomatikong pinagsama ayon sa oras at lugar). Mga attribute: localizedTitle, assetCollectionType, assetCollectionSubtype, startDate, endDate.
PHCollectionList — folder na naglalaman ng mga album (PHAssetCollection) o iba pang folder. Bihirang gamitin, pangunahin para sa pagpapakita ng hierarchy sa user interface.
Ang PhotoKit ay hindi nagbabalik ng UIImage nang direkta mula sa PHAsset — kailangan mong humiling ng imahe sa pamamagitan ng PHImageManager. Ginagarantiyahan nito na ang imahe ay na-load na isinasaalang-alang ang iCloud, caching, at ang kinakailangang laki.
| Component | Layunin | Katangian |
|---|---|---|
| PHImageManager.default() | Standard manager para sa mga solong query | Walang caching sa pagitan ng mga query |
| PHCachingImageManager | Manager na may preloading para sa mga collection | startCachingImages para sa maayos na scrolling |
| PHImageRequestOptions | Mga setting ng query: laki, mode, delivery | synchronous, deliveryMode, progressHandler |
| PHImageRequestID | Identifier ng query para sa pagkansela | cancelImageRequest(PHImageRequestID) |
Sinusuportahan ng PHImageManager ang tatlong mode ng delivery: opportunistic (una ang pinababang bersyon, pagkatapos ang buo), highQualityFormat (buong kalidad lamang) at fastFormat (pinakamabilis na available na bersyon). Para sa mga collection laging gamitin ang PHCachingImageManager na may preloading ng mga imahe para sa mga visible na cell.
Ang PhotoKit ay ginagamit para sa paggawa ng mga custom na gallery, editor, at app para sa pagtatrabaho sa media. Tingnan natin ang tatlong pangunahing scenario.
PHAsset.fetchAssets na may PHFetchOptions at pag-uuri ayon sa petsa ng paggawa — pangunahing query para sa pagbuo ng custom na photo gallery. Sinusuportahan ng PHFetchResult ang lazy-loading at streaming access.
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("Natagpuan \(allPhotos.count) mga larawan")
allPhotos.enumerateObjects { asset, index, stop in
print("Larawan \(index): \(asset.localIdentifier)")
}
PHFetchResult — thread-safe lalagyan. Ang access sa mga object ayon sa index sa pamamagitan ng object(at:) ay hindi humaharang sa UI, ngunit ang paghiling ng imahe sa pamamagitan ng PHImageManager ay dapat isagawa nang asynchronous.
PHCachingImageManager — subclass ng PHImageManager na may mga method na startCachingImages at stopCachingImages para sa preloading. Ginagamit sa UICollectionView para sa maayos na scrolling.
let cachingManager = PHCachingImageManager()
let targetSize = CGSize(width: 200, height: 200)
// Preloading para sa mga visible na cell
cachingManager.startCachingImages(
for: visibleAssets,
targetSize: targetSize,
contentMode: .aspectFill,
options: nil
)
// Paghiling ng imahe sa pamamagitan ng PHImageRequestOptions na may iCloud fallback
let requestOptions = PHImageRequestOptions()
requestOptions.deliveryMode = .opportunistic
requestOptions.isNetworkAccessAllowed = .true
requestOptions.progressHandler = { progress, error, stop, info in
DispatchQueue.main.async {
print("Nagda-download mula sa iCloud: \(progress * 100)%")
}
}
let requestID = cachingManager.requestImage(
for: asset,
targetSize: targetSize,
contentMode: .aspectFill,
options: requestOptions
) { image, info in
print("Natanggap ang imahe: \(image?.size ?? .zero)")
}
Ang mga pagbabago sa mediathèque ay isinasagawa sa pamamagitan ng PHPhotoLibrary.shared().performChanges sa loob ng changeRequest block. Lahat ng operasyon ay pinagsama-sama at inilalapat nang transaksyonal.
PHPhotoLibrary.shared().performChanges {
let changeRequest = PHAssetChangeRequest(for: asset)
changeRequest.isFavorite = .true
} completionHandler: { success, error in
if success {
print("Idinagdag sa mga paborito")
}
}
Ang PhotoKit ay nagbibigay ng mekanismo ng pagmamasid sa mga pagbabago sa mediathèque sa pamamagitan ng protocol na PHPhotoLibraryChangeObserver. Sa anumang pagbabago (paggawa, pagtanggal, pag-edit) ang method na photoLibraryDidChange ay tinatawag na may PHChange object.
Ang PHChange ay naglalaman ng changeDetails para sa bawat uri ng query: PHFetchResultChangeDetails na may removedIndexes, insertedIndexes, changedIndexes. Ito ay nagpapahintulot sa paglalapat ng mga pagbabago sa UI na may animation: performBatchUpdates na may move, insert, delete para sa UICollectionView.
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
// Ilapat ang mga pagbabago sa collectionView
}
}
}
Sinusuportahan ng PhotoKit ang pag-edit ng media sa pamamagitan ng mekanismo ng PHContentEditingInput at PHContentEditingOutput. Ang app ay humihiling ng editingInput na may orihinal na data, naglalapat ng mga pagbabago, at nag-save ng resulta sa pamamagitan ng editingOutput. Awtomatikong pinapanatili ng framework ang orihinal, na nagpapahintulot sa user na i-undo ang mga pagbabago sa pamamagitan ng pag-reset sa orihinal.
Ang mga RAW na larawan (DNG, CR2, NEF) ay sinusuportahan sa pamamagitan ng PHAssetResourceManager, na nagbibigay ng access sa orihinal na RAW file. Para sa RAW processing inirerekomenda ang paggamit ng CoreImage na may CIRAWFilter filter, na sumusuporta sa pagsasaayos ng temperatura, exposure, at sharpness. Sinusuportahan din ng PhotoKit ang mga extension ng editor sa pamamagitan ng Photo Editing Extension (iOS) — ang app ay maaaring tawagin mula sa system editor para sa pag-process ng napiling larawan o video.
PhotoKit — isang makapangyarihan ngunit resource-intensive framework. Ang maling paggamit ay maaaring humantong sa pagbagal habang nag-scroll at labis na paggamit ng memorya. Sundin ang mga rekomendasyon para sa pinakamainam na performance.
PHLivePhoto — nangangailangan ng hiwalay na query sa pamamagitan ng PHLivePhoto.request(with:targetSize:contentMode:options:resultHandler:). Huwag humiling ng Live Photo para sa mga cell kung saan ang larawan lamang ang ipinapakita — gamitin ang PHLivePhotoBadge para sa indikasyon.
Mga Madalas Itanong
PhotoKit — isang modernong Apple framework para sa pagtatrabaho sa mediathèque, ipinakilala sa iOS 8. Hindi tulad ng lumang AssetsLibrary, ang PhotoKit ay nagbibigay ng object model na PHAsset, PHFetchResult na may mabilis na paghahanap, suporta sa iCloud, at Change Tracking para sa pagmamasid sa mga pagbabago.
Tawagan ang PHPhotoLibrary.requestAuthorization(for: .readWrite) na may paghawak sa callback. Pagkatapos makuha ang status na .authorized maaari kang magsagawa ng mga query na PHAsset.fetchAssets. Para sa pagsulat kailangan ang .readWrite access. Para sa read lamang — .addOnly.
Gamitin ang PHImageManager.default().requestImage na may mga parameter: asset, targetSize, contentMode at PHImageRequestOptions. Ang asynchronous method ay nagbabalik ng PHImageRequestID, na nagpapahintulot sa pagkansela ng query. Para sa mga collection gamitin ang PHCachingImageManager na may preloading.
Mag-rehistro ng observer sa pamamagitan ng PHPhotoLibrary.shared().register(self) at ipatupad ang protocol na PHPhotoLibraryChangeObserver. Sa method na photoLibraryDidChange makakatanggap ka ng PHChange na may changeDetails para sa bawat fetchResult at ilapat ang mga pagbabago sa UI na may animation.
Sa PHImageRequestOptions itakda ang isNetworkAccessAllowed = true at progressHandler para sa pagsubaybay ng pag-load mula sa iCloud. Sa mabilis na pag-scroll huwag paganahin ang network access at i-load lamang ang mga lokal na bersyon upang maiwasan ang mga pagkaantala habang nag-scroll.
Buod
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din