PhotoKit — ano ito, mga pangunahing konsepto at PHAsset

May-akda: IT Sectr Nai-publish: 2026-05-06 Oras ng pagbabasa: 8 min

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 para sa pagtatrabaho sa system mediathèque, nagbibigay ng access sa mga larawan, video, Live Photos, at album.
  • PHAsset — modelo ng data na kumakatawan sa isang media content (larawan o video) na may metadata: petsa, lokasyon, uri.
  • PHFetchResult — lalagyan ng mga resulta ng query na may streaming loading at mga notification ng pagbabago sa pamamagitan ng PHPhotoLibraryChangeObserver.
  • PHImageManager — manager para sa pagkuha ng mga imahe na may mga opsyon sa laki, mode, at caching sa pamamagitan ng PHCachingImageManager.
  • PHPhotoLibrary — entry point para sa pagsasagawa ng mga pagbabago: paggawa, pagtanggal, at pag-edit ng mga media object.

Ano ang PhotoKit?

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.

Paano gumagana ang PhotoKit: modelo ng data at mga 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).

Pagsasagawa ng mga query

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.

  • fetchAssets(with:options:) — query ng lahat ng media na may filtering ayon sa uri, petsa, album
  • fetchAssetCollections(with:subtype:options:) — query ng mga album at folder
  • fetchAssets(in:options:) — query ng media sa loob ng isang partikular na album

PHFetchOptions

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.

Mga pangunahing klase ng PhotoKit

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

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

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

PHCollectionList — folder na naglalaman ng mga album (PHAssetCollection) o iba pang folder. Bihirang gamitin, pangunahin para sa pagpapakita ng hierarchy sa user interface.

PHImageManager at caching

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.

ComponentLayuninKatangian
PHImageManager.default()Standard manager para sa mga solong queryWalang caching sa pagitan ng mga query
PHCachingImageManagerManager na may preloading para sa mga collectionstartCachingImages para sa maayos na scrolling
PHImageRequestOptionsMga setting ng query: laki, mode, deliverysynchronous, deliveryMode, progressHandler
PHImageRequestIDIdentifier ng query para sa pagkanselacancelImageRequest(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.

Mga halimbawa ng paggamit ng PhotoKit sa Swift

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.

Query ng lahat ng larawan mula sa mediathèque

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.

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

Pag-load ng imahe na may caching

PHCachingImageManager — subclass ng PHImageManager na may mga method na startCachingImages at stopCachingImages para sa preloading. Ginagamit sa UICollectionView para sa maayos na scrolling.

swift
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)")
}

Pag-edit ng mediathèque: pagdaragdag sa mga paborito

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.

swift
PHPhotoLibrary.shared().performChanges {
    let changeRequest = PHAssetChangeRequest(for: asset)
    changeRequest.isFavorite = .true
} completionHandler: { success, error in
    if success {
        print("Idinagdag sa mga paborito")
    }
}

Mga pagbabago at pagmamasid sa pamamagitan ng Change Tracking

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.

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
            // Ilapat ang mga pagbabago sa collectionView
        }
    }
}

Pag-edit ng RAW at mga extension

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.

Pag-optimize ng pagtatrabaho sa PhotoKit

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.

  • Gamitin ang PHCachingImageManager para sa mga collection — preloading ng mga imahe para sa visible +-1 screen na mga cell ay nag-aalis ng mga pagkaantala habang nag-scroll
  • Itakda ang targetSize — huwag kailanman humiling ng PHImageManagerMaximumSize para sa mga thumbnail. Gumamit ng sukat na katumbas ng pisikal na sukat ng cell na pinarami ng scale ng screen
  • Kanselahin ang mga query kapag muling ginamit ang cell — i-save ang PHImageRequestID at tawagan ang cancelImageRequest sa prepareForReuse
  • Limitahan ang mga iCloud query — sa mabilis na pag-scroll itakda ang isNetworkAccessAllowed = false at i-load ang iCloud na mga larawan lamang kapag huminto
  • I-cache ang PHFetchResult — ang paulit-ulit na fetchAssets na may parehong opsyon ay nagbabalik ng bagong PHFetchResult. Itago ang resulta sa property at i-update sa pamamagitan ng Change Observer

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

Ano ang PhotoKit at paano ito naiiba sa AssetsLibrary?

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.

Paano humiling ng access sa mediathèque sa pamamagitan ng PhotoKit?

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.

Paano makakuha ng imahe mula sa PHAsset?

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.

Paano subaybayan ang mga pagbabago sa mediathèque?

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.

Paano pangasiwaan ang mga iCloud na larawan sa PhotoKit?

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

  • PhotoKit — Apple framework para sa pagtatrabaho sa mediathèque, na pumalit sa AssetsLibrary mula noong iOS 8 at macOS 10.11.
  • PHAsset — pangunahing modelo ng data na may lokal na identifier, uri, petsa, lokasyon, at laki.
  • PHFetchResult ay nagsasagawa ng synchronous query sa storage at nagbibigay ng thread-safe access sa mga resulta.
  • PHCachingImageManager na may preloading ay nagsisiguro ng maayos na scrolling sa mga collection nang walang pagkaantala.
  • Change Tracking sa pamamagitan ng PHPhotoLibraryChangeObserver ay nagpapahintulot sa UI na agad na tumugon sa mga pagbabago sa mediathèque.
  • iCloud sync ay naka-embed sa framework: ang paghiling ng imahe ay awtomatikong naglo-load nito mula sa iCloud na may progreso.
  • Pag-optimize — tamang targetSize, pagkansela ng query, at paghihigpit ng iCloud habang nag-scroll ay kritikal para sa performance.

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.

Pag-usapan ang proyekto

Basahin din