iCloud

2011-12-07 39 views
7

का उपयोग करके एक प्लेलिस्ट फ़ाइल साझा करना मेरे पास एक रिलेटिवली सरल ऐप है जो दस्तावेज़ फ़ोल्डर में स्थित एक प्लेस्ट फ़ाइल में डेटा को जारी रखता है। डेटा स्टार्टअप पर UITableView में लोड होता है। उपयोगकर्ता तब रिकॉर्ड को संपादित, हटा या जोड़ सकता है और किसी भी बदलाव को प्लेलिस्ट फ़ाइल में वापस सहेजा जा सकता है।iCloud

अब मैं iCloud का उपयोग कर डिवाइस पर इस डेटा (प्लेस्ट फ़ाइल) को साझा करना चाहता हूं। मैंने प्रलेखन को देखा है और मेरी समझ यह है कि मुझे प्लेस्ट फ़ाइल को "प्रबंधित" करने के लिए एक यूआईडी दस्तावेज़ बनाना होगा।

मैंने कई आईक्लाउड ट्यूटोरियल्स को देखा है, हालांकि वे सभी UIDocument क्लास में एक संपत्ति के भीतर एक साधारण स्ट्रिंग स्टोर करते हैं, न कि पूरी फ़ाइल (एक प्लिस्ट की तरह)।

मैं UIDocument ऑब्जेक्ट का उपयोग करके iCloud पर अपनी प्लेलिस्ट फ़ाइल (या किसी अन्य फ़ाइल, उस मामले के लिए) कैसे साझा करूं?

क्या मैं plist फ़ाइल सामग्री को NSData में परिवर्तित कर दूंगा, फिर उसे UIDocument में किसी संपत्ति में सहेजूं? क्या मुझे इसके बजाय NsFileWrapper का उपयोग करना चाहिए?

मुझे लगता है कि यूआईडी दस्तावेज़/आईक्लाउड व्यवस्था के आसपास मेरे सिर को लपेटने में मुश्किल हो रही है। मैं शायद इसे और अधिक जटिल बना रहा हूं तो यह वास्तव में है।

+0

क्या आपको इसके लिए कोई जवाब मिला? मैं वही काम कर रहा हूं और मेरा ऐप आपके जैसा ही लगता है। यदि आपको एक अच्छा ट्यूटोरियल मिला तो कृपया मुझे बताएं। – Jackson

+0

मैं इसे पूरा करने की कोशिश भी कर रहा हूं।मैं एनएसएसटींग के साथ ट्यूटोरियल को संशोधित कर रहा हूं, लेकिन मुझे डेटा देखने के लिए दूसरा डिवाइस नहीं मिल रहा है। – zambono

+0

ditto। पोस्टर को +1 – autodidakto

उत्तर

1

UIDocument के साथ एक प्लेस्ट का उपयोग करने के लिए, आप UIDocument को उपclass कर सकते हैं और self.myDictionary (आपकी plist) के साथ निम्नलिखित 2 विधियों को ओवरराइड कर सकते हैं NSMutableDictionary के रूप में घोषित किया गया है।

- (BOOL)loadFromContents:(id)contents ofType:(NSString *)typeName error:(NSError **)outError 
{  
    if ([contents length] > 0) 
    { 
     NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:(NSData *)contents]; 
     NSMutableDictionary *dataDictionary = [unarchiver decodeObjectForKey:@"data"]; 

     self.myDictionary = dataDictionary; 
     [unarchiver finishDecoding]; 
     [unarchiver release]; 
    } 
    else 
    { 
     self.myDictionary = [NSMutableDictionary dictionary]; 
    } 

    return YES;  
} 

- (id)contentsForType:(NSString *)typeName error:(NSError **)outError 
{ 
    NSMutableData *data = [[[NSMutableData alloc] init] autorelease]; 
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; 
    if(!self.myDictionary) 
    { 
     self.myDictionary = [NSMutableDictionary dictionary]; 
    } 
    [archiver encodeObject:self.myDictionary forKey:@"data"]; 

    [archiver finishEncoding]; 
    [archiver release]; 
    return data; 
} 
+0

यह एक शब्दकोश प्लिस्ट नहीं बनाता है यह एक संग्रह प्लिस्ट बनाता है लेकिन पर्याप्त करीब है। एक असली प्लिस्ट बनाने के लिए NSPropertyListSerialization का उपयोग करें और आप या तो xml या बाइनरी आउटपुट चुन सकते हैं। – malhal

+0

संग्रह सूची भी मैक और आईओएस के बीच संगत नहीं हैं। – malhal

7

सुनिश्चित नहीं है कि किसी को अभी भी इसके लिए समाधान की आवश्यकता है लेकिन मुझे इसे काम करने के लिए एक अच्छा तरीका मिला।

चूंकि यूआईडी दस्तावेज़ केवल एनएसडीटा या एनएसफ़ाइलवापर के रूप में डेटा स्वीकार करता है, मैंने पहली बार एनएस डिक्शनरी कक्षा के लिए एक श्रेणी बनाई जो एनएसडीटा से एनएस डिक्शनरी लौटाता है।

NSDictionary + DictFromData.h:

#import <Foundation/Foundation.h> 

@interface NSDictionary (DictFromData) 
+ (id)dictionaryWithData:(NSData *)data; 
- (id)initWithData:(NSData *)data; 
@end 

और NSDictionary + DictFromData.m

#import "NSDictionary+DictFromData.h" 
@implementation NSDictionary (DictFromData) 

+ (id)dictionaryWithData:(NSData *)data { 
    return [[[NSDictionary alloc] initWithData:data] autorelease]; 
} 

- (id)initWithData:(NSData *)data { 
    NSString *tmp = nil; 

    self = (NSDictionary *)[NSPropertyListSerialization 
          propertyListFromData:data 
          mutabilityOption:NSPropertyListImmutable 
          format:NULL 
          errorDescription:&tmp]; 

    NSAssert1(tmp == nil,@"Error in plist: %@",tmp); 
    return [self retain]; 
} 
@end 

(source)

आप तो अब आयात यहाँ श्रेणी के लिए दो फ़ाइलों है आपके यूआईडीओटी सबक्लास में यह श्रेणी, आप आसानी से अपनी प्लिस्ट फ़ाइल को अपने iCloud कंटेनर में लोड और सहेज सकते हैं।

- (id)contentsForType:(NSString *)typeName error:(NSError **)outError { 
    NSData * plistData = [[[NSData alloc]initWithContentsOfFile:YOUR_PLIST_FILE]autorelease]; 
    return plistData; 
} 

: अपने डेटा बचत वापस iCloud में जोड़ने के लिए

- (BOOL)loadFromContents:(id)contents 
        ofType:(NSString *) 
     typeName error:(NSError **)outError { 

    if ([contents length] > 0){ 
     self.contents = [NSDictionary dictionaryWithData:contents]; 
    } else { 
     self.contents = nil; 
    } 

    // call some Methods to handle the incoming NSDictionary 
    // maybe overwrite the old Plist file with the new NSDictionary 

    return YES; 
} 

:

अपने Plist लोड करने के लिए iCloud अपने UIDocument उपवर्ग में जोड़ने से (संपत्ति सामग्री एक NSDictionary है) यदि आप अब कॉल करते हैं:

[myUIDocument updateChangeCount:UIDocumentChangeDone]; 

YOUR_PLIST_FILE सिंक्रनाइज़ हो रहा है। याद रखें कि अपडेट करने के लिए आपके iCloud कंटेनर के लिए लगभग 10-15sec लगता है।