2012-07-01 12 views
5

Używam iCloud z danymi podstawowymi do synchronizowania danych mojej aplikacji.Jak zmusić iCloud z danymi podstawowymi do synchronizacji?

Próbowałem wszystkiego i nareszcie działa idealnie.

ale mam jedno pytanie.

Czy istnieje sposób, aby powiedzieć do iCloud, aby zsynchronizować?

Synchronizuje się po uruchomieniu aplikacji, ale innym razem. Wygląda na to, że synchronizuje się losowo. Nie potrafię sam sobie z tym poradzić.

any help?

Dzięki.

+0

To samo pytanie .. Chcę również wymusić synchronizację –

Odpowiedz

0

Trzeba zmusić dowolny element bibliotece NSURL być buforowane w iCloud z tą metodą:

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

jesteś potrzeba, aby uruchomić tę metodę na każdym katalogu i pliku czego pobierania/tworzenia w dokumentach lub biblioteki informator.

0

Nie sądzę, że masz jakąkolwiek kontrolę nad tym, kiedy nastąpi synchronizacja podczas używania iCloud i danych podstawowych. Korzystając z UIDocument i iCloud, użyłem startDownloadingUbiquitousItemAtURL z różnym powodzeniem, ale dla danych podstawowych nie sądzę, by istniał jakikolwiek odpowiednik - chciałbym usłyszeć, jak ktoś mi mówi inaczej, jednak ...

1

Dowiedziałem się, jak zmusić rdzeń magazynu danych do zsynchronizowania z usługą iCloud. Wystarczy "dotknąć" dowolne pliki pokwitowań w folderze Dane w systemie plików Ubiquity. Poniższy kod zrobi to. Aby wymusić synchronizację, wywołaj metodę syncCloud. Dla każdego znalezionego pliku "pokwitowania" zaktualizuje on sygnaturę czasową modyfikacji plików do bieżącego czasu, zasadniczo wykonując "dotyk" pliku. Jak tylko to się stanie, iCloud sprawdzi i zsynchronizuje wszystkie podstawowe pliki danych wymagające synchronizacji w iCloud. Z tego co wiem, tak działa symulator lub Xcode po wybraniu opcji "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; 
     } 
    }); 
} 
Powiązane problemy