2011-12-02 10 views
11

मैं Apple's documentation around UIManagedDocument गूढ़ रहस्य मुसीबत का एक बहुत हो रही है, विशेष रूप से निम्न विधियों:मैं अपने UIManagedDocument फ़ाइल पैकेज में अतिरिक्त सामग्री कैसे सहेजूं?

  • - (id)additionalContentForURL:(NSURL *)absoluteURL error:(NSError **)error
  • - (BOOL)readAdditionalContentFromURL:(NSURL *)absoluteURL error:(NSError **)error
  • - (BOOL)writeAdditionalContent:(id)content toURL:(NSURL *)absoluteURL originalContentsURL:(NSURL *)absoluteOriginalContentsURL error:(NSError **)error

किसी को भी सफलतापूर्वक में अतिरिक्त सामग्री को बचाने में कामयाब रहा है " अतिरिक्त सामग्री "निर्देशिका उनके UIManagedDocument संकुल के अंदर? मैं यूआईआईडीएस का उपयोग फ़ाइल नाम (सही फ़ाइल एक्सटेंशन के साथ) के रूप में इस निर्देशिका में सीधे छवियों (पीएनजी, जेपीईजी, आदि) और वीडियो (एम 4 वी, आदि) को सहेजना चाहता हूं, और इन व्यक्तिगत फ़ाइलों के संदर्भों को NSString फ़ाइल पथ के रूप में संग्रहीत करना चाहता हूं मेरी लगातार दुकान।

+0

क्या आपके पास इसके साथ कोई भाग्य है? मैं एक ही चीज़ में देख रहा हूँ। –

उत्तर

12

क्रेडिट इस श्रेणी को समझने में मेरी सहायता के लिए Apple DTS पर जाता है। मैं कुछ उदाहरण साझा कर रहा हूं, उन्होंने मुझे यहां मदद की (थोड़ा संशोधित)।

ठीक है, तो मूल रूप से ऐसा लगता है कि यह काम करता है: उपवर्ग UIManagedDocument, और निम्न विधियों में (जहां extraInfo संपत्ति सिर्फ एक NSDictionary हमारे उपवर्ग पर लागू) को लागू:

- (BOOL)readAdditionalContentFromURL:(NSURL *)absoluteURL error:(NSError **)error 
{ 
    NSURL *myURL = [absoluteURL URLByAppendingPathComponent:@"AdditionalInformation.plist"]; 
    self.extraInfo = [NSDictionary dictionaryWithContentsOfURL:myURL]; 
    return YES; 
} 

- (id)additionalContentForURL:(NSURL *)absoluteURL error:(NSError **)error 
{ 
    if (!self.extraInfo) { 
     return [NSDictionary dictionaryWithObjectsAndKeys: @"Picard", @"Captain", [[NSDate date] description], @"RightNow", nil]; 
    } else { 
     NSMutableDictionary *updatedFriendInfo = [self.extraInfo mutableCopy]; 
     [updatedFriendInfo setObject:[[NSDate date] description] forKey:@"RightNow"]; 
     [updatedFriendInfo setObject:@"YES" forKey:@"Updated"]; 

     return updatedFriendInfo; 
    } 
} 

- (BOOL)writeAdditionalContent:(id)content toURL:(NSURL *)absoluteURL originalContentsURL:(NSURL *)absoluteOriginalContentsURL error:(NSError **)error 
{ 
    if (content) { 
     NSURL *myURL = [absoluteURL URLByAppendingPathComponent:@"AdditionalInformation.plist"]; 
     [(NSDictionary *)content writeToURL:myURL atomically:NO]; 
    } 

    return YES; 
} 

UIManagedDocument इन तरीकों कॉल करेंगे जब यह AdditionalContent निर्देशिका के अंदर दस्तावेज़ पैकेज में सहेजने के लिए आपको जो कुछ भी चाहिए, उसे स्वचालित रूप से सहेजने की आवश्यकता है।

आप एक को बचाने के लिए मजबूर करने की जरूरत है, बस अपने UIManagedDocument उदाहरण पर निम्नलिखित फोन:

[self updateChangeCount:UIDocumentChangeDone]; 

वर्तमान में, मैं चित्र और वीडियो के लिए इस का उपयोग नहीं कर रहा हूँ - लेकिन उदाहरण के लिए पर्याप्त आप देना चाहिए चले जाओ।

+0

बढ़िया, इसके लिए धन्यवाद! केवल एक चीज जो मुझे अनिश्चित है, फाइलों का प्रबंधन है (उदाहरण के लिए फोटो, एमपी 3, इत्यादि) जो दस्तावेज़ से जुड़ी होंगी। क्या यह दस्तावेज़ के फ़ाइल रैपर की अतिरिक्त सामग्री निर्देशिका में फ़ाइल पहुंच को समन्वयित करके मैन्युअल रूप से किया गया है? –

+1

तो मूल रूप से जिस तरह से मैं इसे संभालने जा रहा था, वह UIManagedDocument subclass से जुड़ी सरणी में मनमानी फ़ाइलों के NSURLs को पढ़ने/लिखना था। जब 'readAdditionalContentFromURL: त्रुटि:' विधि कहा जाता है, डिस्क पर यूआरएल की एक सूची प्राप्त करें और उसे स्टोर करें।जब भी आप लिखते हैं तो आपको कुछ प्रकार के कैश को उप-वर्ग से जोड़ना होगा जब आप लिखते हैं अतिरिक्त सामग्री: toURL: originalContentsURL: त्रुटि: 'वास्तव में डिस्क/फोटो/एमपी 3 डिस्क को डिस्क पर लिखने के लिए कहा जाता है। आप फ़ाइलों को अस्थायी निर्देशिका में तब तक स्टोर करना चुन सकते हैं जब तक कि यह फ्लश न हो। –

+1

मुझे ऐसा करने का एक बहुत साफ तरीका नहीं दिखाई दे रहा था, इसलिए दिया गया है कि मैं इस परियोजना के लिए आईओएस 5 और उच्चतर को लक्षित कर रहा हूं, मैंने अपने कोर डेटा स्टोर में बाइनरी गुणों के बाहरी भंडारण को सक्षम किया है, और मैंने छवियों और वीडियो को अपने लगातार में धक्का दिया अतिरिक्त सामग्री निर्देशिका के बजाय स्टोर करें। अब तक, यह एक उचित समझौता रहा है और मैंने प्रदर्शन या व्यवहार के साथ कोई समस्या नहीं देखी है (मुझे पता है कि दूसरों के पास बाहरी भंडारण है)। क्षमा करें, यह एक सही उत्तर नहीं है, लेकिन iCloud के साथ जोड़े गए कई एपीआई की तरह मुझे नहीं लगता कि ऐप्पल ने दस्तावेज़ांकन पूरा कर लिया है^एच^एच^एच^एच^एच^एच^एच^एच^एच^एच^एच उन्हें –

3

-डिशनलकंटेंटफॉरर के लिए प्रलेखन: त्रुटि: इंगित करता है कि त्रुटि को सिग्नल करने के लिए एक शून्य को वापस करना।

A return value of nil indicates an error condition. To avoid generating 
    an exception, you must return a value from this method. If it is not always 
    the case that there will be additional content, you should return a sentinel value (for example, an NSNull instance) that you check for in 
    writeAdditionalContent:toURL:originalContentsURL:error:. 

मैं एक और उद्देश्य के लिए -writeContents:andAttributes:safelyToURL:forSaveOperation:error: ओवरराइड (एक नई दस्तावेज़ के बचाने पहली पर कुछ काम करना), और बुला सुपर NSException देवताओं का आह्वान क्योंकि contents मूल्य नहीं के बराबर, एक NSDictionary नहीं मालूम होता है UIManagedDocument आशा के अनुरूप है। हम्म।

जितना अधिक आप जानते हैं ...

पीएस मुझे लगता है कि यह दिन के समय पर निर्भर करता है- लिखने के साथ सामग्री: और विशेषताएं: ... एक बार एनएस डिक्शनरी की अपेक्षा करने के बारे में शिकायत करने के लिए एक अपवाद फेंक दिया, लेकिन बाद में एक अपवाद फेंक दिया कि मैंने इसे एनएसडीटा पास नहीं किया है। मेरी भौहें अब और अधिक स्पॉक जैसी फैशन में नहीं उठाई जा सकती है।

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