2011-12-07 16 views
7

Ho una semplice app relativley che mantiene i dati in un file plist situato nella cartella dei documenti. I dati vengono caricati in UITableView all'avvio. L'utente può quindi modificare, eliminare o aggiungere record e qualsiasi modifica viene salvata nel file plist.Condivisione di un file plist utilizzando iCloud

Ora desidero condividere questi dati (il file plist) tra dispositivi tramite iCloud. Ho esaminato la documentazione e la mia comprensione è che ho bisogno di creare un UIDocument per "gestire" il file plist.

Ho guardato diversi tutorial iCloud comunque tutti memorizzare una semplice stringa all'interno di una proprietà nella classe UIDocument, non un intero file (come un plist).

Come condividere il file Plist (o qualsiasi altro file, se del caso) su iCloud utilizzando l'oggetto UIDocument?

Devo convertire il contenuto del file plist in NSData, quindi salvarlo in una proprietà nell'UIDocument? Dovrei usare invece NsFileWrapper?

Mi sembra di avere un momento difficile avvolgendo la mia mente attorno alla disposizione UIDocument/iCloud. Probabilmente lo sto rendendo più complicato di quanto lo sia davvero.

+0

Hai trovato una risposta per questo? Sto cercando di fare la stessa cosa e la mia app sembra molto simile alla tua. Per favore fatemi sapere se avete trovato un buon tutorial. – Jackson

+0

Sto anche cercando di farlo.Ho modificato il tutorial con NSString, ma non riesco a ottenere il secondo dispositivo per vedere i dati. – zambono

+0

idem. +1 al poster – autodidakto

risposta

1

Per utilizzare un plist con UIDocument, è possibile sottoclasse UIDocument e sovrascrive i seguenti 2 metodi con self.myDictionary (il plist) dichiarato come NSMutableDictionary.

+0

Questo non crea un dizionario plist, ma crea un archivio plist ma è abbastanza vicino. Per creare un plist reale usa NSPropertyListSerialization e puoi scegliere l'output xml o binario. – malhal

+0

Anche i file di archivio non sono compatibili tra Mac e iOS. – malhal

7

Non so se qualcuno ha ancora bisogno di una soluzione per questo, ma ho trovato un buon modo per farlo funzionare.

Poiché UIDocument accetta solo dati come NSData o NSFilewrapper, ho prima creato una categoria per la classe NSDictionary che restituisce un NSDictionary da NSData. Ecco i due file per la categoria:

NSDictionary + DictFromData.h:

#import <Foundation/Foundation.h> 

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

e la 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)

Se ora import questa categoria nella sottoclasse UIDocument, puoi facilmente caricare e salvare il tuo file Plist nel tuo contenitore iCloud.

per caricare il tuo Plist da iCloud aggiungere questo alla tua sottoclasse UIDocument (I contenuti di proprietà è un NSDictionary):

- (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; 
} 

Per salvare i dati di nuovo al iCloud aggiungere questo:

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

Se ora si chiama:

[myUIDocument updateChangeCount:UIDocumentChangeDone]; 

YOUR_PLIST_FILE è sempre sincronizzato. Ricorda che occorrono circa 10-15 secondi per l'aggiornamento del tuo contenitore iCloud.

Problemi correlati