2012-07-01 6 views
5

Ich verwende iCloud mit Kerndaten, um Daten meiner App zu synchronisieren.Wie erzwinge ich die iCloud mit Core-Daten für die Synchronisierung?

Ich habe alles versucht und schließlich funktioniert es perfekt.

aber ich habe eine Frage.

Gibt es eine Möglichkeit, zu iCloud zu synchronisieren?

Es synchronisiert, wenn App beginnen, aber das andere Mal. Es sieht so aus, als ob es zufällig synchronisiert wird. Ich kann den Weg nicht selbst finden.

Hilfe?

Danke.

+0

Gleiche Frage .. Ich möchte auch die Synchronisierung erzwingen –

Antwort

0

Sie haben zu zwingen, jeden NSURL Artikel mit dieser Methode in iCloud zwischengespeichert werden:

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

Sie sind notwendig, diese Methode auf jedem Verzeichnis zu starten und Datei, die Sie den Download/in Dokumenten oder Bibliothek zu schaffen Verzeichnis.

0

Ich glaube nicht, dass Sie die Kontrolle über die Synchronisierung haben, wenn Sie iCloud und Core-Daten verwenden. Mit UIDocument und iCloud habe ich startDownloadingUbiquitousItemAtURL mit unterschiedlichem Erfolg verwendet, aber für Core-Daten glaube ich nicht, dass es ein Äquivalent gibt - ich würde gerne hören, wie mir jemand anderes sagt ...

1

Ich habe herausgefunden, wie Erzwingen, dass ein zentraler Datenspeicher mit iCloud synchronisiert wird. Sie müssen nur alle Quittungsdateien im Ordner "Data" des Ubiquity-Dateisystems "anfassen". Der folgende Code wird dies tun. Um eine Synchronisierung zu erzwingen, rufen Sie die syncCloud-Methode auf. Für jede "Quittungs" -Datei, die es findet, wird der Änderungszeitpunkt der Dateien auf die aktuelle Zeit aktualisiert, wobei im Wesentlichen ein "Berühren" der Datei erfolgt. Sobald dies der Fall ist, prüft und synchronisiert iCloud alle wichtigen Datendateien, die in iCloud synchronisiert werden müssen. Soweit ich das beurteilen kann, macht es der Simulator oder Xcode, wenn Sie die Option "Trigger iCloud Sync" auswählen.

@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; 
     } 
    }); 
}