2012-07-01 15 views
5

Uso iCloud con i dati di base per sincronizzare i dati della mia app.Come forzare iCloud con i dati di base per fare la sincronizzazione?

Ho provato tutto e finalmente funziona perfettamente.

ma ho una domanda.

C'è un modo per dire a iCloud di sincronizzare?

Si sincronizza all'avvio dell'app, ma l'altra volta. Sembra che si sincronizzi a caso. Non riesco a trovare il modo di gestirlo da solo.

aiuto?

Grazie.

+0

Stessa domanda .. Voglio anche forzare la sincronizzazione –

risposta

0

Bisogna forzare qualsiasi elemento NSURL da memorizzare nella cache in iCloud con questo metodo:

- (BOOL)addBackupAttributeToItemAtURL:(NSURL *)URL 
{ 
    NSLog(@"URL: %@", URL); 
    assert([[NSFileManager defaultManager] fileExistsAtPath: [URL path]]); 

    NSError *error = nil; 
    BOOL success = [URL setResourceValue: [NSNumber numberWithBool: NO] 
            forKey: NSURLIsExcludedFromBackupKey error: &error]; 
    return success; 
} 

Non Sei necessità di lanciare questo metodo su ogni directory e file che si sta scaricando/creare in Documenti o Biblioteca directory.

0

Non credo che tu abbia alcun controllo su quando si verificherà la sincronizzazione quando utilizzi iCloud e core-data. Con UIDocument e iCloud ho usato startDownloadingUbiquitousItemAtURL con vari gradi di successo ma per core-data non penso che ci sia un equivalente - mi piacerebbe sentire qualcuno dire altrimenti altrimenti ...

1

Ho capito come forzare un archivio dati principale da sincronizzare su iCloud. Devi solo "toccare" i file di ricevute nella cartella Dati nel filesystem di Ubiquity. Il codice qui sotto farà questo. Per forzare una sincronizzazione, chiama il metodo syncCloud. Per ogni file "ricevuta" rilevato, aggiornerà l'indicatore di data/ora di modifica dei file all'ora corrente, essenzialmente facendo un "tocco" sul file. Non appena ciò accadrà, iCloud controllerà e sincronizzerà tutti i file di dati di base che necessitano della sincronizzazione in iCloud. Per quanto posso dire, questo è come il simulatore o Xcode lo fa quando selezioni l'opzione "Trigger iCloud Sync".

@property (strong, nonatomic) NSMetadataQuery *query; 

-(void) init 
{ 
    self.query = [[NSMetadataQuery alloc] init]; 

    [[NSNotificationCenter defaultCenter] addObserver: self 
              selector: @selector(didFinishMetadataQuery) 
               name: NSMetadataQueryDidFinishGatheringNotification 
               object: self.query]; 
} 

-(void) didFinishMetadataQuery 
{ 
    // Query completed so mark it as completed 
    [self.query stopQuery]; 

    // For each receipt, set the modification date to now to force an iCloud sync 
    for(NSMetadataItem *item in self.query.results) 
    { 
     [[NSFileManager defaultManager] setAttributes: @{NSFileModificationDate:[NSDate date]} 
             ofItemAtPath: [[item valueForAttribute: NSMetadataItemURLKey] path] 
               error: nil]; 
    } 
} 

-(void) syncCloud 
{ 
    // Look for files in the ubiquity container data folders 
    [self.query setSearchScopes:@[NSMetadataQueryUbiquitousDataScope]]; 

    // Look for any files named "receipt*" 
    [self.query setPredicate:[NSPredicate predicateWithFormat:@"%K like 'receipt*'", NSMetadataItemFSNameKey]]; 

    // Start the query on the main thread 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     BOOL startedQuery = [self.query startQuery]; 
     if (!startedQuery) 
     { 
      NSLog(@"Failed to start query.\n"); 
      return; 
     } 
    }); 
} 
Problemi correlati