2012-04-11 17 views
2

Ich versuche, eine .plist zu speichern, die ich in meine NSUserDefaults erstellt habe, so dass ich die Daten speichern kann, die ich hineinlege, also wenn die App gestoppt wird (aus Multitasking-Leiste entfernt) nicht die Werte verlieren.So speichern Sie PLIST zu NSUserDefaults

Ich habe zu diesem Tutorial darauf here

Darin ist diesen Beispielcode hat.

-(void)saveToUserDefaults:(NSString*)myString 
{ 
    NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults]; 

    if (standardUserDefaults) { 
     [standardUserDefaults setObject:myString forKey:@"Prefs"]; 
     [standardUserDefaults synchronize]; 
    } 
} 

-(NSString*)retrieveFromUserDefaults 
{ 
    NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults]; 
    NSString *val = nil; 

    if (standardUserDefaults) 
     val = [standardUserDefaults objectForKey:@"Prefs"]; 

    return val; 
} 

Was ich mit etwas Hilfe möchte ist, wie Dosis die oben beziehen .plists zu retten?

Ich habe einen .plist Controller-Klasse, die das Bündel liest .plist ein neues .plist im Root-Dokument erstellt dann liest und schreibt, dass zu ... wie so verwende ich den oben, es zu speichern, wenn die App Exits oder schaltet sich aus?

So lade und schreibe ich meine .plist, im Moment mit Singlettons und es ist in seiner eigenen Klasse.

#pragma mark Singleton Methods 
+ (id)sharedManager { 
    @synchronized(self) { 
     if (sharedMyManager == nil) 
      sharedMyManager = [[self alloc] init]; 
    } 
    return sharedMyManager; 
} 
- (id)init { 
    if (self = [super init]) { 

     // Data.plist code 
     // get paths from root direcory 
     NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES); 
     // get documents path 
     NSString *documentsPath = [paths objectAtIndex:0]; 
     // get the path to our Data/plist file 
     NSString *plistPath = [documentsPath stringByAppendingPathComponent:@"EngineProperties.plist"]; 

     // check to see if Data.plist exists in documents 
     if (![[NSFileManager defaultManager] fileExistsAtPath:plistPath]) 
     { 
      // if not in documents, get property list from main bundle 
      plistPath = [[NSBundle mainBundle] pathForResource:@"EngineProperties" ofType:@"plist"]; 
     } 

     // read property list into memory as an NSData object 
     NSData *plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath]; 
     NSString *errorDesc = nil; 
     NSPropertyListFormat format; 
     // convert static property liost into dictionary object 
     NSDictionary *tempRoot = (NSMutableDictionary *)[NSPropertyListSerialization propertyListFromData:plistXML mutabilityOption:NSPropertyListMutableContainersAndLeaves format:&format errorDescription:&errorDesc]; 
     if (!tempRoot) 
     { 
      NSLog(@"Error reading plist: %@, format: %d", errorDesc, format); 
     } 
     // assign values 
     self.signature = [tempRoot objectForKey:@"Signature"]; 
     self.version = [tempRoot objectForKey:@"Version"]; 
     self.request = [tempRoot objectForKey:@"Request"]; 
     self.dataVersion = [tempRoot objectForKey:@"Data Version"]; 

     man = [cacheValue objectForKey:@"Man"]; 
     mod = [cacheValue objectForKey:@"Mod"]; 
     sub = [cacheValue objectForKey:@"SubMod"]; 

     cacheValue = [tempRoot objectForKey:@"Cache Value"]; 
    } 


    - (void) saveData:(NSString *)methodName signature:(NSString *)pSignature Version:(NSNumber *)pVersion request:(NSNumber *)rNumber dataVersion:(NSNumber *)dvReturned cacheValue:(NSNumber *)cValue; 
    { 
     // get paths from root direcory 
     NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES); 
     // get documents path 
     NSString *documentsPath = [paths objectAtIndex:0]; 
     // get the path to our Data/plist file 
     NSString *plistPath = [documentsPath stringByAppendingPathComponent:@"EngineProperties.plist"]; 

     // set the variables to the values in the text fields 
     self.signature = pSignature; 
     self.version = pVersion; 
     self.request = rNumber; 
     self.dataVersion = dvReturned; 

     //do some if statment stuff here to put the cache in the right place or what have you. 
     if (methodName == @"manufacturers") 
     { 
      self.man = cValue; 
     } 
     else if (methodName == @"models") 
     { 
      self.mod = cValue; 
     } 
     else if (methodName == @"subMod") 
     { 
      self.sub = cValue; 
     } 

     self.cacheValue = [NSDictionary dictionaryWithObjectsAndKeys: 
          man, @"Manufacturers", 
          mod, @"Models", 
          sub, @"SubModels", nil]; 


     NSDictionary *plistDict = [NSDictionary dictionaryWithObjectsAndKeys: 
            signature, @"Signature", 
            version, @"Version", 
            request, @"Request", 
            dataVersion, @"Data Version", 
            cacheValue, @"Cache Value", nil]; 



     NSString *error = nil; 
     // create NSData from dictionary 
     NSData *plistData = [NSPropertyListSerialization dataFromPropertyList:plistDict format:NSPropertyListXMLFormat_v1_0 errorDescription:&error]; 

     // check is plistData exists 
     if(plistData) 
     { 
      // write plistData to our Data.plist file 
      [plistData writeToFile:plistPath atomically:YES]; 

      NSString *myString = [[NSString alloc] initWithData:plistData encoding:NSUTF8StringEncoding]; 
      //  NSLog(@"%@", myString); 
     } 
     else 
     { 
      NSLog(@"Error in saveData: %@", error); 
      //  [error release]; 
     } 
    } 


    @end 
+0

Sie sollten beide verwenden. Ich schlage vor, 'NSUserDefaults' zu verwenden. Viel sauberere Codes. – Raptor

+0

richtig, so dass Sie nicht wirklich ein Plist in nsuserdefaults speichern können? –

+0

Nein, du kannst nicht. Stellen Sie sich NSUserDefaults als unsichtbare .plist vor, auf die Sie lesen und schreiben können, ohne jemals die Datei tatsächlich sehen zu können. –

Antwort

5

Sie können .plist nicht in NSUserDefaults schreiben, zumindest nicht praktisch. Um dies zu erreichen, müssen Sie bestimmte Schlüssel von .plist in NSUserDefaults schreiben, was im Grunde ist, als würden Sie zwei Kopien aller Ihrer Daten speichern. Sie können sich NSUserDefaults als eine unsichtbare .plist vorstellen, die Sie lesen und schreiben können, ohne jemals die Datei tatsächlich sehen zu können. Mit NSUserDefaults können gespeicherte Werte wiederhergestellt werden, selbst wenn die App in Multitasking beendet wurde.

Wie Sie jedoch zwischen .plist und NSUserDefaults wählen, sollte davon abhängen, wie viele Daten Sie speichern müssen. Apple empfiehlt, nur kleine Datenmengen unter NSUserDefaults zu speichern. Wenn Sie eine Menge Informationen speichern müssen, dann ist .plist der Weg zu gehen. Entweder das oder natürlich Core-Data.

+0

jede Chance, die Sie meine und Vignesh Unterschiede auf Plisten lösen können, verlieren ihre Werte, wenn sie aus dem Hintergrund entfernt werden? –

+0

@MDT Warum können wir in NSUserdefaults keine PLIST schreiben, können wir NSData nicht in NSUserDefaults speichern ?. – Vignesh

+0

@Vignesh Sie haben mich vor einem Schnitt gefangen, Sie können dies tun, aber es ist nicht wirklich praktisch, dies zu tun. –

0

.plist ist eine Schlüssel/Wert-Paar-Datei. Welches ist im Wesentlichen ein Wörterbuch. Wenn Sie Daten in einer .plist-Datei speichern, bleiben Sie bestehen. Du kannst es zurückbekommen, selbst wenn deine App getötet wird.

NSUserDefaults macht das gleiche. Es ist sauberer und schneller. Also ist jeder Ansatz ausreichend.

+0

Vielen Dank für Ihre Antwort, möchte ich nur darauf hinweisen, dass ich ziemlich umfangreiche Tests auf meinem Plist, die ich erstellt habe, und ja die Werte bleiben in Ihrem Plist, wenn Sie Ihre Anwendung verlassen haben.Wenn Sie es jedoch aus der Multitask-Leiste löschen (Sie sind sich nicht sicher, ob die Terminologie richtig ist), verlieren Sie den in der plist-Datei gespeicherten Wert, den Sie in Ihren Stammdokumente-Ordner für Lese-/Schreibfunktionen kopiert haben. –

+0

@ C.Johns, Nein. Ich denke nicht. Es wird bestehen bleiben. – Vignesh

+0

hrmm .. naja, vielleicht fehlt mir dann etwas. Aber ich habe überall nachgesehen und finde keine Möglichkeit, die plist-Werte persistent zu machen, wenn eine App aus dem Hintergrund entfernt (gestoppt) wird. wäre schön, wenn mir jemand Code zur Verfügung stellen würde, um zu verhindern, dass dies passiert, weil ich ihn verwenden könnte, anstatt mit NSUserDefaults starten zu müssen. –

Verwandte Themen