2014-10-30 11 views
5

अधिक विशेष रूप से, आप कैसे जान सकते हैं कि PHAsset में अंतर्निहित संपत्ति का वर्तमान संस्करण मूल से अलग है?कैसे पता चलेगा कि एक PHAsset संशोधित किया गया है?

मेरे उपयोगकर्ता को केवल आवश्यक होने पर वर्तमान या मूल संपत्ति के बीच चयन करने की आवश्यकता होनी चाहिए। और फिर मुझे PHImageRequestOptions.version के लिए उनके उत्तर की आवश्यकता है।

उत्तर

4

मुझे संशोधनों के लिए PHAsset की जांच करने के दो तरीके मिले हैं और मैंने इसे Gist के रूप में प्रकाशित किया है।

- (void)tb_checkForModificationsWithEditingInputMethodCompletion:(void (^)(BOOL))completion { 
    PHContentEditingInputRequestOptions *options = [PHContentEditingInputRequestOptions new]; 
    options.canHandleAdjustmentData = ^BOOL(PHAdjustmentData *adjustmentData) { return YES; }; 

    [self requestContentEditingInputWithOptions:options completionHandler:^(PHContentEditingInput *contentEditingInput, NSDictionary *info) { 
     if (completion) completion(contentEditingInput.adjustmentData != nil); 
    }]; 
} 

- (void)tb_checkForModificationsWithAssetPathMethodCompletion:(void (^)(BOOL))completion { 
    PHVideoRequestOptions *options = [PHVideoRequestOptions new]; 
    options.deliveryMode = PHVideoRequestOptionsDeliveryModeFastFormat; 

    [[PHImageManager defaultManager] requestAVAssetForVideo:self options:options resultHandler:^(AVAsset *asset, AVAudioMix *audioMix, NSDictionary *info) { 
     if (completion) completion([[asset description] containsString:@"/Mutations/"]); 
    }]; 
} 

संपादित करें: मैं उस बिंदु पर था जहां मुझे एक छवि के साथ PHAsset के लिए समान कार्यक्षमता की आवश्यकता थी। मैंने इसका इस्तेमाल किया:

- (void)tb_checkForModificationsWithAssetPathMethodCompletion:(void (^)(BOOL))completion { 
    [self requestContentEditingInputWithOptions:nil completionHandler:^(PHContentEditingInput *contentEditingInput, NSDictionary *info) { 
     NSString *path = (contentEditingInput.avAsset) ? [contentEditingInput.avAsset description] : contentEditingInput.fullSizeImageURL.path; 
     completion([path containsString:@"/Mutations/"]); 
    }]; 
} 
2

PHImageRequestOptionsVersion

PHImageRequestOptionsVersionCurrent

अनुरोध छवि परिसंपत्ति (एक है कि सभी संपादन को दर्शाता है) का नवीनतम संस्करण पर एक नजर डालें। परिणामस्वरूप छवि सभी पहले किए गए समायोजन से प्रस्तुत आउटपुट है।

PHImageRequestOptionsVersionUnadjusted

अनुरोध समायोजन के बिना चित्र संपत्ति का एक संस्करण।
यदि संपत्ति संपादित की गई है, तो परिणामी छवि किसी भी संपादन के पहले संपत्ति की स्थिति को दर्शाती है।

PHImageRequestOptionsVersionOriginal

अनुरोध मूल, उच्चतम निष्ठा चित्र संपत्ति का संस्करण। परिणामस्वरूप छवि मूल रूप से संपत्ति के आयातित संस्करण को आयात या आयात किया गया है, चाहे किसी भी संपादन के बावजूद।

यदि आप संपत्तियों को पुनर्प्राप्त करने से पहले उपयोगकर्ता से पूछते हैं, तो आप जानते हैं कि कौन सा संस्करण उपयोगकर्ता निर्दिष्ट है। अगर आपको कहीं और से एक फासेट मिलता है, तो आप मूल संपत्ति प्राप्त करने के लिए एक वापसी एसेट कॉन्टेंट टॉऑरिगिनल कर सकते हैं। और PHAsset में संशोधन और निर्माण दिनांक गुण हैं, आप यह बता सकते हैं कि PHAsset संशोधित है या नहीं।

+0

मैंने प्रश्न अपडेट किया है, मुझे * PHImageRequestOptions * सही तरीके से बनाने के लिए जानकारी चाहिए। –

+0

[प्रलेखन] (https://developer.apple.com/library/IOs/documentation/Photos/Reference/PHAsset_Class/index.html#//apple_ref/occ/instp/PHAsset/modificationDate): 'फोटो संशोधन दिनांक अपडेट करता है जब किसी संपत्ति की छवि या वीडियो सामग्री या मेटाडेटा बदलता है। 'इसलिए जब आप कोई चित्र पसंद करते हैं तो संशोधन दिनांक भी बदल जाएगा। –

+0

क्या आपने उस पर एक परीक्षण किया है? – gabbler

0

मुझे यह कोड केवल एक काम करने वाला पाया गया है, और यह किनारे के अधिकांश मामलों को संभालता है। यह सबसे तेज़ नहीं हो सकता है लेकिन अधिकांश छवियों के प्रकार के लिए अच्छा काम करता है। यह सबसे छोटी संभव मूल और संशोधित छवि लेता है और उनकी डेटा सामग्री की तुलना करता है।

@implementation PHAsset (Utilities) 
- (void)checkEditingHistoryCompletion:(void (^)(BOOL edited))completion 
{ 
    PHImageManager *manager = [PHImageManager defaultManager]; 

    CGSize compareSize = CGSizeMake(64, 48); 

    PHImageRequestOptions *requestOptions = [PHImageRequestOptions new]; 
    requestOptions.synchronous = YES; 
    requestOptions.deliveryMode = PHImageRequestOptionsDeliveryModeFastFormat; 
    requestOptions.version = PHImageRequestOptionsVersionOriginal; 

    [manager requestImageForAsset:self 
         targetSize:compareSize 
         contentMode:PHImageContentModeAspectFit 
          options:requestOptions 
        resultHandler:^(UIImage *originalResult, NSDictionary *info) { 

         UIImage *currentImage = originalResult; 

         requestOptions.version = PHImageRequestOptionsVersionCurrent; 

         [manager requestImageForAsset:self 
              targetSize:currentImage.size 
              contentMode:PHImageContentModeAspectFit 
               options:requestOptions 
             resultHandler:^(UIImage *currentResult, NSDictionary *info) { 

              NSData *currData = UIImageJPEGRepresentation(currentResult, 0.1); 
              NSData *orgData = UIImageJPEGRepresentation(currentImage, 0.1); 

              if (completion) { 

               //handle case when both images cannot be retrived it also mean no edition 
               if ((currData == nil) && (orgData == nil)) { 
                completion(NO); 
                return; 
               } 

               completion(([currData isEqualToData:orgData] == NO)); 
              } 
             }]; 
        }]; 
} 

@end 
+0

आपका समाधान केवल छवियों के लिए काम करता है। स्वीकार्य उत्तर से दूसरा कोड ब्लॉक (EDIT के बाद वाला) आपके लिए काम नहीं करता है? –

+0

दुर्भाग्यवश नहीं:/मुझे संशोधन के बाद भी नियमित पथ प्राप्त हो रहा है उदाहरण: पथ \t एनएसएसटींग * \t @ "/ var/मोबाइल/मीडिया/डीसीआईएम/100APPLE/IMG_0736.PNG" \t 0x15d683d0 –

संबंधित मुद्दे

 संबंधित मुद्दे