PhotoKit — τι είναι, βασικές έννοιες και PHAsset

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-05-06 Χρόνος ανάγνωσης: 8 λεπ

PhotoKit — είναι το πλαίσιο της Apple για εργασία με την πολυμεσική βιβλιοθήκη σε iOS και macOS, παρέχοντας άμεση πρόσβαση σε φωτογραφίες, βίντεο και Live Photos στη συσκευή. Σύμφωνα με την τεκμηρίωση της Apple, το πλαίσιο αντικαθιστά την παλαιότερη AssetsLibrary και υποστηρίζει iCloud, άλμπουμ, επεξεργασία και Change Tracking. PhotoKit παρέχει ένα ενοποιημένο API για ερωτήματα, προσωρινή αποθήκευση και αλλαγές στην πολυμεσική βιβλιοθήκη με αυτόματο συγχρονισμό μέσω iCloud.

Κύρια σημεία

  • PhotoKit — πλαίσιο της Apple για εργασία με την πολυμεσική βιβλιοθήκη συστήματος, παρέχοντας πρόσβαση σε φωτογραφίες, βίντεο, Live Photos και άλμπουμ.
  • PHAsset — μοντέλο δεδομένων που αντιπροσωπεύει ένα μεμονωμένο πολυμεσικό περιεχόμενο (φωτογραφία ή βίντεο) με μεταδεδομένα: ημερομηνία, τοποθεσία, τύπος.
  • PHFetchResult — δοχείο αποτελεσμάτων ερωτήματος με φόρτωση ροής και ειδοποιήσεις αλλαγών μέσω PHPhotoLibraryChangeObserver.
  • PHImageManager — διαχειριστής για λήψη εικόνων με επιλογές μεγέθους, λειτουργίας και προσωρινής αποθήκευσης μέσω PHCachingImageManager.
  • PHPhotoLibrary — σημείο εισόδου για την πραγματοποίηση αλλαγών: δημιουργία, διαγραφή και επεξεργασία πολυμεσικών αντικειμένων.

Τι είναι το PhotoKit;

PhotoKit — πλαίσιο της Apple (παρουσιάστηκε στο iOS 8, macOS 10.11), που παρέχει αντικειμενοστραφή API για εργασία με την πολυμεσική βιβλιοθήκη συστήματος. Σε αντίθεση με το AssetsLibrary, το PhotoKit λειτουργεί με την πολυμεσική βιβλιοθήκη ως βάση δεδομένων: τα ερωτήματα επιστρέφουν αντικείμενα PHAsset, PHCollection, PHCollectionList, που αντιπροσωπεύουν το περιεχόμενο και τη δομή αποθήκευσης.

Το PhotoKit υποστηρίζει όλους τους τύπους πολυμέσων: φωτογραφίες (JPEG, HEIF, RAW), βίντεο (MOV, MP4), Live Photos και σειριακές λήψεις. Το πλαίσιο διαχειρίζεται αυτόματα τον συγχρονισμό iCloud: αν η εικόνα είναι αποθηκευμένη στο iCloud, το PhotoKit την ζητά μέσω δικτύου και αναφέρει πρόοδο μέσω PHImageRequestOptions.progressHandler.

Το βασικό χαρακτηριστικό του PhotoKit — μοντέλο δεδομένων βασισμένο σε PHObject με τοπικό αναγνωριστικό (localIdentifier), που παραμένει σταθερό μεταξύ συνεδριών. Αυτό επιτρέπει την αποθήκευση αναφορών σε πολυμεσικά αντικείμενα και την επαναφορά τους μετά από επανεκκίνηση της εφαρμογής χωρίς νέο ερώτημα.

Πώς λειτουργεί το PhotoKit: μοντέλο δεδομένων και ερωτήματα

Το PhotoKit είναι χτισμένο σε τρία επίπεδα: μοντέλο δεδομένων (PHObject), ερωτήματα (PHFetchResult) και αλλαγές (PHPhotoLibrary.performChanges). Το μοντέλο δεδομένων είναι ιεραρχικό: το PHAsset (φωτογραφία/βίντεο) βρίσκεται μέσα σε PHAssetCollection (άλμπουμ), τα άλμπουμ ομαδοποιούνται σε PHCollectionList (φάκελος).

Εκτέλεση ερωτημάτων

Τα ερωτήματα εκτελούνται μέσω PHAsset.fetchAssets και PHAssetCollection.fetchAssetCollections. Όλες οι μέθοδοι fetch είναι σύγχρονες και επιστρέφουν PHFetchResult, του οποίου το αντικείμενο εκτελεί αμέσως το ερώτημα στη βάση δεδομένων της πολυμεσικής βιβλιοθήκης. Το PHFetchResult υποστηρίζει γρήγορη πρόσβαση βάσει ευρετηρίου (object(at:)) και απαρίθμηση μέσω enumerateObjects.

  • fetchAssets(with:options:) — ερώτημα όλων των πολυμέσων με φιλτράρισμα κατά τύπο, ημερομηνία, άλμπουμ
  • fetchAssetCollections(with:subtype:options:) — ερώτημα άλμπουμ και φακέλων
  • fetchAssets(in:options:) — ερώτημα πολυμέσων εντός συγκεκριμένου άλμπουμ

PHFetchOptions

PHFetchOptions — αντικείμενο για διαμόρφωση ερωτήματος: ταξινόμηση (sortDescriptors), κατηγόρημα (predicate), συμπερίληψη κρυφών και διαγραμμένων πολυμέσων (includeHiddenAssets, includeAllBurstAssets). Οι επιλογές fetch επιτρέπουν φιλτράρισμα κατά τύπο πολυμέσου: PHAssetMediaType.image, .video, .audio.

Βασικές κλάσεις του PhotoKit

Το PhotoKit περιλαμβάνει ένα σύνολο κλάσεων για πρόσβαση, ερώτημα και αλλαγή της πολυμεσικής βιβλιοθήκης. Η κατανόηση κάθε μίας είναι απαραίτητη για αποτελεσματική εργασία με το πλαίσιο.

PHAsset

PHAsset — αμετάβλητο αντικείμενο που αντιπροσωπεύει ένα μεμονωμένο πολυμεσικό περιεχόμενο. Περιέχει μεταδεδομένα: mediaType, mediaSubtypes, creationDate, location, pixelWidth, pixelHeight, duration (για βίντεο), isFavorite, burstIdentifier. LocalIdentifier — σταθερό κλειδί κειμένου, προσβάσιμο ακόμη και μετά από επανεκκίνηση της εφαρμογής.

PHAssetCollection

PHAssetCollection — ομάδα πολυμέσων: άλμπουμ συστήματος (Recents, Favorites, Selfies, Screenshots), άλμπουμ χρήστη ή Moments (αυτόματα ομαδοποιημένα κατά χρόνο και τοποθεσία). Χαρακτηριστικά: localizedTitle, assetCollectionType, assetCollectionSubtype, startDate, endDate.

PHCollectionList

PHCollectionList — φάκελος που περιέχει άλμπουμ (PHAssetCollection) ή άλλους φακέλους. Χρησιμοποιείται σπάνια, κυρίως για εμφάνιση ιεραρχίας στη διεπαφή χρήστη.

PHImageManager και προσωρινή αποθήκευση

Το PhotoKit δεν επιστρέφει UIImage απευθείας από το PHAsset — πρέπει να ζητήσετε την εικόνα μέσω PHImageManager. Αυτό εγγυάται ότι η εικόνα φορτώνεται λαμβάνοντας υπόψη το iCloud, την προσωρινή αποθήκευση και το απαιτούμενο μέγεθος.

ΣτοιχείοΣκοπόςΧαρακτηριστικό
PHImageManager.default()Τυπικός διαχειριστής για μεμονωμένα ερωτήματαΧωρίς προσωρινή αποθήκευση μεταξύ ερωτημάτων
PHCachingImageManagerΔιαχειριστής με προφόρτωση για συλλογέςstartCachingImages για ομαλή κύλιση
PHImageRequestOptionsΡυθμίσεις ερωτήματος: μέγεθος, λειτουργία, παράδοσηsynchronous, deliveryMode, progressHandler
PHImageRequestIDΑναγνωριστικό ερωτήματος για ακύρωσηcancelImageRequest(PHImageRequestID)

Το PHImageManager υποστηρίζει τρεις λειτουργίες παράδοσης: opportunistic (πρώτα μειωμένη έκδοση, μετά πλήρης), highQualityFormat (μόνο πλήρης ποιότητα) και fastFormat (ταχύτερη διαθέσιμη έκδοση). Για συλλογές χρησιμοποιείτε πάντα PHCachingImageManager με προφόρτωση εικόνων για ορατά κελιά.

Παραδείγματα χρήσης PhotoKit σε Swift

Το PhotoKit χρησιμοποιείται για τη δημιουργία προσαρμοσμένων γκαλερί, επεξεργαστών και εφαρμογών για εργασία με πολυμέσα. Ας εξετάσουμε τρία βασικά σενάρια.

Ερώτημα όλων των φωτογραφιών από την πολυμεσική βιβλιοθήκη

PHAsset.fetchAssets με PHFetchOptions και ταξινόμηση κατά ημερομηνία δημιουργίας — βασικό ερώτημα για τη δημιουργία προσαρμοσμένης φωτογραφικής γκαλερί. Το PHFetchResult υποστηρίζει τεμπέλικη φόρτωση και πρόσβαση ροής.

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("Βρέθηκαν \(allPhotos.count) φωτογραφίες")

allPhotos.enumerateObjects { asset, index, stop in
    print("Φωτογραφία \(index): \(asset.localIdentifier)")
}

PHFetchResult — ασφαλές για νήματα δοχείο. Η πρόσβαση σε αντικείμενα βάσει ευρετηρίου μέσω object(at:) δεν μπλοκάρει το UI, αλλά το αίτημα εικόνας μέσω PHImageManager πρέπει να εκτελείται ασύγχρονα.

Φόρτωση εικόνας με προσωρινή αποθήκευση

PHCachingImageManager — υποκλάση του PHImageManager με μεθόδους startCachingImages και stopCachingImages για προφόρτωση. Χρησιμοποιείται στο UICollectionView για ομαλή κύλιση.

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

// Προφόρτωση για ορατά κελιά
cachingManager.startCachingImages(
    for: visibleAssets,
    targetSize: targetSize,
    contentMode: .aspectFill,
    options: nil
)

// Αίτημα εικόνας μέσω PHImageRequestOptions με iCloud fallback
let requestOptions = PHImageRequestOptions()
requestOptions.deliveryMode = .opportunistic
requestOptions.isNetworkAccessAllowed = .true
requestOptions.progressHandler = { progress, error, stop, info in
    DispatchQueue.main.async {
        print("Λήψη από iCloud: \(progress * 100)%")
    }
}

let requestID = cachingManager.requestImage(
    for: asset,
    targetSize: targetSize,
    contentMode: .aspectFill,
    options: requestOptions
) { image, info in
    print("Εικόνα λήφθηκε: \(image?.size ?? .zero)")
}

Επεξεργασία πολυμεσικής βιβλιοθήκης: προσθήκη στα αγαπημένα

Οι αλλαγές στην πολυμεσική βιβλιοθήκη εκτελούνται μέσω PHPhotoLibrary.shared().performChanges εντός του μπλοκ changeRequest. Όλες οι λειτουργίες ομαδοποιούνται και εφαρμόζονται συναλλαγματικά.

swift
PHPhotoLibrary.shared().performChanges {
    let changeRequest = PHAssetChangeRequest(for: asset)
    changeRequest.isFavorite = .true
} completionHandler: { success, error in
    if success {
        print("Προστέθηκε στα αγαπημένα")
    }
}

Αλλαγές και παρακολούθηση μέσω Change Tracking

Το PhotoKit παρέχει μηχανισμό παρακολούθησης αλλαγών στην πολυμεσική βιβλιοθήκη μέσω του πρωτοκόλλου PHPhotoLibraryChangeObserver. Σε οποιαδήποτε αλλαγή (δημιουργία, διαγραφή, επεξεργασία) καλείται η μέθοδος photoLibraryDidChange με αντικείμενο PHChange.

Το PHChange περιέχει changeDetails για κάθε τύπο ερωτήματος: PHFetchResultChangeDetails με removedIndexes, insertedIndexes, changedIndexes. Αυτό επιτρέπει την εφαρμογή αλλαγών στο UI με κινούμενα σχέδια: performBatchUpdates με move, insert, delete για 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
            // Εφαρμογή αλλαγών στο collectionView
        }
    }
}

Επεξεργασία RAW και επεκτάσεις

Το PhotoKit υποστηρίζει επεξεργασία πολυμέσων μέσω του μηχανισμού PHContentEditingInput και PHContentEditingOutput. Η εφαρμογή ζητά editingInput με πρωτότυπα δεδομένα, εφαρμόζει αλλαγές και αποθηκεύει το αποτέλεσμα μέσω editingOutput. Το πλαίσιο διατηρεί αυτόματα το πρωτότυπο, επιτρέποντας στον χρήστη να αναιρέσει αλλαγές μέσω επαναφοράς στο πρωτότυπο.

Οι φωτογραφίες RAW (DNG, CR2, NEF) υποστηρίζονται μέσω PHAssetResourceManager, το οποίο παρέχει πρόσβαση στο πρωτότυπο αρχείο RAW. Για επεξεργασία RAW συνιστάται η χρήση CoreImage με το φίλτρο CIRAWFilter, το οποίο υποστηρίζει ρύθμιση θερμοκρασίας, έκθεσης και ευκρίνειας. Το PhotoKit υποστηρίζει επίσης επεκτάσεις επεξεργαστών μέσω Photo Editing Extension (iOS) — η εφαρμογή μπορεί να κληθεί από τον επεξεργαστή συστήματος για επεξεργασία επιλεγμένης φωτογραφίας ή βίντεο.

Βελτιστοποίηση εργασίας με το PhotoKit

PhotoKit — ένα ισχυρό αλλά εντατικό σε πόρους πλαίσιο. Η λανθασμένη χρήση μπορεί να οδηγήσει σε επιβράδυνση κατά την κύλιση και υπερβολική κατανάλωση μνήμης. Ακολουθήστε τις συστάσεις για βέλτιστη απόδοση.

  • Χρησιμοποιήστε PHCachingImageManager για συλλογές — η προφόρτωση εικόνων για ορατά +-1 οθόνη κελιά εξαλείφει καθυστερήσεις κατά την κύλιση
  • Ορίστε targetSize — μην ζητάτε ποτέ PHImageManagerMaximumSize για μικρογραφίες. Χρησιμοποιήστε μέγεθος ίσο με το φυσικό μέγεθος κελιού πολλαπλασιασμένο με την κλίμακα οθόνης
  • Ακυρώστε ερωτήματα κατά την επαναχρησιμοποίηση κελιού — αποθηκεύστε PHImageRequestID και καλέστε cancelImageRequest στο prepareForReuse
  • Περιορίστε ερωτήματα iCloud — κατά γρήγορη κύλιση ορίστε isNetworkAccessAllowed = false και φορτώστε φωτογραφίες iCloud μόνο κατά τη στάση
  • Αποθηκεύστε προσωρινά το PHFetchResult — επαναλαμβανόμενα fetchAssets με ίδιες επιλογές επιστρέφουν νέο PHFetchResult. Κρατήστε το αποτέλεσμα σε ιδιότητα και ενημερώστε μέσω Change Observer

PHLivePhoto — απαιτεί ξεχωριστό ερώτημα μέσω PHLivePhoto.request(with:targetSize:contentMode:options:resultHandler:). Μην ζητάτε Live Photo για κελιά όπου εμφανίζεται μόνο φωτογραφία — χρησιμοποιήστε PHLivePhotoBadge για ένδειξη.

Συχνές ερωτήσεις

Τι είναι το PhotoKit και σε τι διαφέρει από το AssetsLibrary;

PhotoKit — ένα σύγχρονο πλαίσιο της Apple για εργασία με την πολυμεσική βιβλιοθήκη, που παρουσιάστηκε στο iOS 8. Σε αντίθεση με την παλαιότερη AssetsLibrary, το PhotoKit παρέχει αντικειμενικό μοντέλο PHAsset, PHFetchResult με γρήγορη αναζήτηση, υποστήριξη iCloud και Change Tracking για παρακολούθηση αλλαγών.

Πώς να ζητήσετε πρόσβαση στην πολυμεσική βιβλιοθήκη μέσω PhotoKit;

Καλέστε PHPhotoLibrary.requestAuthorization(for: .readWrite) με χειρισμό στο callback. Μετά τη λήψη κατάστασης .authorized μπορείτε να εκτελείτε ερωτήματα PHAsset.fetchAssets. Για εγγραφή απαιτείται πρόσβαση .readWrite. Για μόνο ανάγνωση — .addOnly.

Πώς να λάβετε εικόνα από το PHAsset;

Χρησιμοποιήστε PHImageManager.default().requestImage με παραμέτρους: asset, targetSize, contentMode και PHImageRequestOptions. Η ασύγχρονη μέθοδος επιστρέφει PHImageRequestID, επιτρέποντας ακύρωση του ερωτήματος. Για συλλογές χρησιμοποιήστε PHCachingImageManager με προφόρτωση.

Πώς να παρακολουθείτε αλλαγές στην πολυμεσική βιβλιοθήκη;

Καταχωρήστε παρατηρητή μέσω PHPhotoLibrary.shared().register(self) και υλοποιήστε το πρωτόκολλο PHPhotoLibraryChangeObserver. Στη μέθοδο photoLibraryDidChange θα λάβετε PHChange με changeDetails για κάθε fetchResult και εφαρμόστε αλλαγές στο UI με κινούμενα σχέδια.

Πώς να χειριστείτε φωτογραφίες iCloud στο PhotoKit;

Στο PHImageRequestOptions ορίστε isNetworkAccessAllowed = true και progressHandler για παρακολούθηση φόρτωσης από iCloud. Κατά γρήγορη κύλιση απενεργοποιήστε την πρόσβαση δικτύου και φορτώστε μόνο τοπικές εκδόσεις για αποφυγή καθυστερήσεων κατά την κύλιση.

Σύνοψη

  • PhotoKit — πλαίσιο της Apple για εργασία με την πολυμεσική βιβλιοθήκη, που αντικατέστησε το AssetsLibrary από iOS 8 και macOS 10.11.
  • PHAsset — το βασικό μοντέλο δεδομένων με τοπικό αναγνωριστικό, τύπο, ημερομηνία, τοποθεσία και μέγεθος.
  • PHFetchResult εκτελεί σύγχρονο ερώτημα στον χώρο αποθήκευσης και παρέχει ασφαλή για νήματα πρόσβαση σε αποτελέσματα.
  • PHCachingImageManager με προφόρτωση εξασφαλίζει ομαλή κύλιση σε συλλογές χωρίς καθυστερήσεις.
  • Change Tracking μέσω PHPhotoLibraryChangeObserver επιτρέπει στο UI να αντιδρά άμεσα σε αλλαγές της πολυμεσικής βιβλιοθήκης.
  • Συγχρονισμός iCloud είναι ενσωματωμένος στο πλαίσιο: το αίτημα εικόνας την φορτώνει αυτόματα από το iCloud με πρόοδο.
  • Βελτιστοποίηση — σωστό targetSize, ακύρωση ερωτημάτων και περιορισμός iCloud κατά την κύλιση είναι κρίσιμα για απόδοση.

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης