2012-07-01 20 views
5

Estoy usando iCloud con datos centrales para sincronizar los datos de mi aplicación.¿Cómo forzar a iCloud con los datos centrales para sincronizar?

Probé todo y finalmente funciona perfectamente.

pero tengo una pregunta.

¿Hay alguna manera de decirle a iCloud que se sincronice?

Se sincroniza cuando la aplicación comienza, pero en el otro momento. Parece que se sincroniza al azar. No puedo encontrar la manera de manejarlo yo mismo.

¿Alguna ayuda?

Gracias.

+0

La misma pregunta .. También quiero forzar la sincronización –

Respuesta

0

Hay que obligar a cualquier elemento NSURL para ser almacenado en caché en iCloud con este método:

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

Usted es necesario para poner en marcha este método en cada directorio y el archivo que está descargando/o la creación de documentos en la Biblioteca directorio.

0

No creo que tenga ningún control sobre cuándo ocurrirá la sincronización cuando use iCloud y core-data. Con UIDocument e iCloud he usado startDownloadingUbiquitousItemAtURL con diversos grados de éxito, pero para core-data no creo que haya ningún equivalente. Me encantaría escuchar que alguien me diga lo contrario ...

1

Descubrí cómo forzar a un almacén de datos central a sincronizarse con iCloud. Solo necesita "tocar" cualquier archivo de recibo en la carpeta Datos en el sistema de archivos Ubiquity. El siguiente código hará esto. Para forzar una sincronización, llama al método syncCloud. Por cada archivo "recibo" que encuentre, actualizará la marca de tiempo de modificación de archivos a la hora actual, esencialmente haciendo un "toque" en el archivo. Tan pronto como esto suceda, iCloud verificará y sincronizará cualquier archivo de datos centrales que necesite sincronización en iCloud. Cerca de lo que puedo decir, así es como lo hace el simulador o Xcode cuando seleccionas la opción "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; 
     } 
    }); 
} 
Cuestiones relacionadas