2014-09-17 15 views
8

के साथ चित्र प्राप्त करते समय डुप्लीकेट से बचें आईओएस 8 पर, मैं डिवाइस पर संग्रहीत सभी तस्वीरें प्राप्त करना चाहता हूं। मेरी समस्या यह है कि मैं उन्हें प्राप्त करता हूं, लेकिन कुछ एक से अधिक उपस्थित होते हैं। PHAsset गुण (छुपा, मीडिया सबटाइप इत्यादि) सभी चित्रों के लिए समान हैं, इसलिए मैं उदाहरण के लिए PHAssetMediaSubtypePhotoHDR उपप्रकारों को रद्द नहीं कर सकता। मुझे मिला एकमात्र तरीका एक ही तारीख के साथ कई चित्र नहीं जोड़ रहा है, लेकिन यह एक समस्या है जब एक ही निर्माण तिथि के साथ कई तस्वीरें सहेजी गईं।PHAsset

क्या कोई जानता है कि मुझे इन डुप्लीकेट क्यों मिलते हैं और मैं उनसे बचने के लिए क्या कर सकता हूं?

PHFetchOptions *fetchOptions = [PHFetchOptions new]; 
    fetchOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES],]; 
    PHFetchResult *phAssets = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:fetchOptions]; 
+0

क्या डुप्लीकेट समान चित्रों को इंगित करते हैं या वे केवल समान रूप से समान हैं? – Scott

+0

वे अलग-अलग चित्रों को इंगित कर रहे हैं जो दृष्टिहीन समान हैं। उनका 'सृजन दिनांक' समान हो सकता है या एक infinitesimal अंतर दिखा सकता है। – olivier

+1

वे विस्फोट की तरह लगते हैं। सी एफ नीचे जवाब दें। –

उत्तर

5

आप लम्हें संग्रह इस्तेमाल करने की कोशिश कर सकते हैं:

PHFetchResult * moments = [PHAssetCollection fetchMomentsWithOptions:nil];    
for (PHAssetCollection * moment in moments) { 
    PHFetchResult * assetsFetchResults = [PHAsset fetchAssetsInAssetCollection:moment options:nil]; 
    for (PHAsset * asset in assetsFetchResults) { 
     //Do something with asset, for example add them to array 
    } 
} 
+0

उपरोक्त दृष्टिकोण के साथ समस्या यह है कि आपको पहले से सभी संपत्तियां प्राप्त करने की आवश्यकता है - इसमें समय लगता है। आईफोन 5 एस पर कुछ हज़ार छवियों के साथ इसमें लगभग 1.5 सेकेंड हैं। हम लंबे समय तक इंतजार नहीं कर सकते !! –

+0

@TapanThaker - यह समय कहां खर्च कर रहा है? क्या यह केवल PHAsset को पकड़ने और इसे सरणी में डालने के लिए है या आप कुछ और कर रहे हैं? मैं जल्द ही इस मुद्दे को भी देख रहा हूं। – BlueVoodoo

+0

बस इसे एक एरे में डालना। –

3

मैं एक ही समस्या थी, और मेरे लिए, डुप्लिकेट छवियों है कि मेरे photostream गए एल्बम में शामिल थे:

यह कैसे मैं चित्रों मिलता है। इस मुद्दे के आसपास काम करने के लिए, अब मैं PHAssetCollection क्लास से FetchMoments विधि का उपयोग करता हूं, और फिर मैं प्रत्येक पल के लिए सभी संपत्तियां प्राप्त करता हूं। इस तरह मैं बार-बार छवियों को प्राप्त किए बिना सभी छवियां प्राप्त करता हूं।

अगर कोई बेहतर समाधान पाता है, तो कृपया मुझे बताएं।

+0

आपके उत्तर के लिए बहुत बहुत धन्यवाद। प्रतीत होता है कि पोंफ से आपका और एक ही समय में सही हो गया है और समान हैं। मुझे उसे जवाब के रूप में चुनना और चिह्नित करना पड़ा क्योंकि भले ही आपकी स्पष्टीकरण बेहतर हो, फिर भी वह कार्य कोड शामिल कर रहा था, जो एक ही समस्या वाले लोगों के लिए इसे जल्दी से उपयोगी बना सकता है। – olivier

+0

हाँ यह वही है जो मैं भी उपयोग कर रहा हूं। यह अच्छी तरह से काम करता है और अभी भी iCloud तस्वीरें उठाता है। – VaporwareWolf

6

आईओएस 8.1 के बाद से, fetchAssetsWithMediaType: और fetchAssetsWithOptions: तरीकों के व्यवहार बदल गया है, और वे अब में संग्रहीत iTunes या फ़ोटो से डिवाइस के लिए सिंक्रनाइज़ तस्वीरें शामिल एक iCloud साझा फोटो स्ट्रीम।

स्रोत: Document Revision History और PHAsset Class Reference

+0

मैं चौंक गया हूं - _shocked! _ - यह पता लगाने के लिए कि दोनों ऐप्पल लिंक टूटा हुआ है। मैं सक्रिय रूप से इसका शोध कर रहा हूं, और ईमानदारी से इस दावे के दस्तावेज़ीकरण या बैक-अप को देखना पसंद करूंगा। –

+1

@ClayBridges: दूसरा लिंक ऐप्पल के ** PHAsset क्लास रेफरेंस ** को इंगित करता है। यदि आप 'fetchAssetsWithMediaType: विकल्प:' विधि प्रलेखन का विस्तार करते हैं, तो आप ** चर्चा ** अनुभाग: _IMPORTANT में निम्नलिखित नोट पढ़ सकते हैं - यदि इस विधि को आईओएस 8.1 पर या उसके बाद लिंक किए गए ऐप द्वारा बुलाया जाता है, तो परिणाम होते हैं iTunes साझा डिवाइस Stream._ में संग्रहीत आईट्यून्स या फ़ोटो से डिवाइस में सिंक्रनाइज़ की गई फ़ोटो शामिल न करें – Rufel

0

एक फ्लायर पर, क्या ये संपत्ति एक विस्फोट का हिस्सा हैं? (सीएफ PHAsset.burstIdentifier, आदि) यदि हां, तो आप तदनुसार समायोजित कर सकते हैं।

0

उदाहरण के लिए आप केवल उच्च गुणवत्ता वाली छवियों को सेट करने के लिए "PHImageRequestOptions" का उपयोग कर सकते हैं!

//Setting up the deliveryMode in PHImageRequestOptions() 
fileprivate func imageRequestOptions() -> PHImageRequestOptions { 
    let requestOption = PHImageRequestOptions() 
    requestOption.deliveryMode = .highQualityFormat 
    return requestOption 
} 

fileprivate func fetchImages(){ 

    let fetchOptions = assetsFetchOptions() //get fetchOptions only. Don`t worry 
    let allPhotos = PHAsset.fetchAssets(with: .image, options: fetchOptions) 

    allPhotos.enumerateObjects({ (asset, index, stop) in 
     print(asset) 

     let imageManager = PHImageManager.default() 
     let targetSize = CGSize(width: 200, height: 200) 

     //This function uses the "imageRequestOptions()" function to set up the "options:" field in this .requestImage() function. 
     imageManager.requestImage(for: asset, targetSize: targetSize, contentMode: .aspectFit, options: self.imageRequestOptions(), resultHandler: { (image, info) in 

      if let image = image { 
       self.images.append(image) 
       self.assets.append(asset) 

       if self.selectedImage == nil { 
        self.selectedImage = image 
       } 
      } 

      if index == allPhotos.count - 1 { 
       self.collectionView?.reloadData() 
      } 
     }) 
    }) 
} 
संबंधित मुद्दे