PhotoKit — यह क्या है, मुख्य अवधारणाएँ और PHAsset

लेखक: IT Sectr प्रकाशित: 2026-05-06 पढ़ने का समय: 8 मिनट

PhotoKit iOS और macOS पर मीडिया लाइब्रेरी के साथ काम करने के लिए Apple का फ्रेमवर्क है, जो डिवाइस पर फ़ोटो, वीडियो और Live Photos तक सीधी पहुँच प्रदान करता है। Apple के दस्तावेज़ीकरण के अनुसार, यह फ्रेमवर्क पुराने AssetsLibrary को बदलता है और iCloud, एल्बम, संपादन और Change Tracking का समर्थन करता है। PhotoKit iCloud के माध्यम से स्वचालित सिंक्रोनाइज़ेशन के साथ क्वेरी, कैशिंग और मीडिया लाइब्रेरी परिवर्तनों के लिए एकीकृत API प्रदान करता है।

मुख्य बातें

  • 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 सीधे PHAsset से UIImage नहीं लौटाता — आपको PHImageManager के माध्यम से इमेज का अनुरोध करना होगा। यह सुनिश्चित करता है कि इमेज iCloud समर्थन, कैशिंग और आवश्यक आकार के साथ लोड हो।

घटकउद्देश्यविशेषता
PHImageManager.default()एकल अनुरोधों के लिए मानक प्रबंधकअनुरोधों के बीच कोई कैशिंग नहीं
PHCachingImageManagerसंग्रह के लिए प्रीलोडिंग के साथ प्रबंधकस्मूथ स्क्रॉलिंग के लिए startCachingImages
PHImageRequestOptionsअनुरोध सेटिंग्स: आकार, मोड, वितरणsynchronous, deliveryMode, progressHandler
PHImageRequestIDरद्द करने के लिए अनुरोध पहचानकर्ताcancelImageRequest(PHImageRequestID)

PHImageManager तीन वितरण मोड का समर्थन करता है: opportunistic (पहले कम संस्करण, फिर पूर्ण), highQualityFormat (केवल पूर्ण गुणवत्ता) और fastFormat (सबसे तेज़ उपलब्ध संस्करण)। संग्रह के लिए, हमेशा दृश्य कोशिकाओं के लिए इमेज प्रीलोडिंग के साथ PHCachingImageManager का उपयोग करें।

Swift में PhotoKit उपयोग के उदाहरण

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 प्रीलोडिंग के लिए startCachingImages और stopCachingImages विधियों के साथ PHImageManager की उपश्रेणी है। इसका उपयोग स्मूथ स्क्रॉलिंग के लिए UICollectionView में किया जाता है।

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

// दृश्य कोशिकाओं के लिए प्रीलोड
cachingManager.startCachingImages(
    for: visibleAssets,
    targetSize: targetSize,
    contentMode: .aspectFill,
    options: nil
)

// PHImageRequestOptions के साथ iCloud फ़ॉलबैक के माध्यम से इमेज अनुरोध
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 प्रोटोकॉल के माध्यम से मीडिया लाइब्रेरी परिवर्तनों का अवलोकन करने के लिए तंत्र प्रदान करता है। जब कोई परिवर्तन होता है (निर्माण, हटाना, संपादन), तो PHChange ऑब्जेक्ट के साथ photoLibraryDidChange विधि कॉल की जाती है।

PHChange में प्रत्येक क्वेरी प्रकार के लिए changeDetails होता है: PHFetchResultChangeDetails जिसमें removedIndexes, insertedIndexes, changedIndexes होते हैं। यह UICollectionView के लिए performBatchUpdates के साथ एनिमेशन के साथ UI में परिवर्तन लागू करने की अनुमति देता है।

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 प्रसंस्करण के लिए, CIRAWFilter के साथ CoreImage का उपयोग करने की अनुशंसा की जाती है, जो तापमान, एक्सपोज़र और तीक्ष्णता के समायोजन का समर्थन करता है। PhotoKit Photo Editing Extension (iOS) के माध्यम से संपादक एक्सटेंशन का भी समर्थन करता है — चयनित फ़ोटो या वीडियो को संसाधित करने के लिए सिस्टम संपादक से एक ऐप को कॉल किया जा सकता है।

PhotoKit प्रदर्शन अनुकूलन

PhotoKit एक शक्तिशाली लेकिन संसाधन-गहन फ्रेमवर्क है। गलत उपयोग से स्क्रॉल लैग और अत्यधिक मेमोरी खपत हो सकती है। इष्टतम प्रदर्शन के लिए इन अनुशंसाओं का पालन करें।

  • संग्रह के लिए PHCachingImageManager का उपयोग करें — दृश्य +/-1 स्क्रीन कोशिकाओं के लिए इमेज प्रीलोडिंग स्क्रॉल लैग को समाप्त करती है
  • targetSize सेट करें — थंबनेल के लिए कभी भी PHImageManagerMaximumSize का अनुरोध न करें। सेल के भौतिक आकार को स्क्रीन स्केल से गुणा करके उपयोग करें
  • सेल पुन: उपयोग पर अनुरोध रद्द करें — PHImageRequestID सहेजें और prepareForReuse में cancelImageRequest कॉल करें
  • 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) कॉल करें। .authorized स्थिति प्राप्त करने के बाद, आप PHAsset.fetchAssets क्वेरी निष्पादित कर सकते हैं। लेखन पहुँच के लिए .readWrite अनुमति आवश्यक है। केवल पढ़ने के लिए — .addOnly.

PHAsset से इमेज कैसे प्राप्त करें?

पैरामीटर के साथ PHImageManager.default().requestImage का उपयोग करें: asset, targetSize, contentMode और PHImageRequestOptions। एसिंक्रोनस विधि PHImageRequestID लौटाती है, जो अनुरोध को रद्द करने की अनुमति देती है। संग्रह के लिए, प्रीलोडिंग के साथ PHCachingImageManager का उपयोग करें।

मीडिया लाइब्रेरी में परिवर्तनों को कैसे ट्रैक करें?

PHPhotoLibrary.shared().register(self) के माध्यम से एक प्रेक्षक पंजीकृत करें और PHPhotoLibraryChangeObserver प्रोटोकॉल लागू करें। photoLibraryDidChange विधि में, प्रत्येक fetchResult के लिए changeDetails के साथ PHChange प्राप्त करें और एनिमेशन के साथ UI में परिवर्तन लागू करें।

PhotoKit में iCloud फ़ोटो को कैसे संभालें?

PHImageRequestOptions में, iCloud डाउनलोड प्रगति को ट्रैक करने के लिए isNetworkAccessAllowed = true और progressHandler सेट करें। तेज़ स्क्रॉलिंग के दौरान, नेटवर्क एक्सेस अक्षम करें और स्क्रॉल देरी से बचने के लिए केवल स्थानीय संस्करण लोड करें।

सारांश

  • PhotoKit मीडिया लाइब्रेरी के साथ काम करने के लिए Apple का फ्रेमवर्क है, जो iOS 8 और macOS 10.11 से AssetsLibrary की जगह लेता है।
  • PHAsset स्थानीय पहचानकर्ता, प्रकार, दिनांक, स्थान और आकार के साथ मुख्य डेटा मॉडल है।
  • PHFetchResult स्टोरेज में सिंक्रोनस क्वेरी करता है और परिणामों तक थ्रेड-सेफ़ पहुँच प्रदान करता है।
  • PHCachingImageManager प्रीलोडिंग के साथ बिना देरी के संग्रह में स्मूथ स्क्रॉलिंग सुनिश्चित करता है।
  • Change Tracking PHPhotoLibraryChangeObserver के माध्यम से UI को मीडिया लाइब्रेरी परिवर्तनों पर तुरंत प्रतिक्रिया करने की अनुमति देता है।
  • iCloud सिंक्रोनाइज़ेशन फ्रेमवर्क में निर्मित है: इमेज का अनुरोध स्वचालित रूप से प्रगति के साथ iCloud से डाउनलोड होता है।
  • अनुकूलन — उचित targetSize, अनुरोध रद्द करना और स्क्रॉलिंग के दौरान iCloud सीमित करना प्रदर्शन के लिए महत्वपूर्ण है।

हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे

IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।

परियोजना पर चर्चा करें

यह भी पढ़ें