Domanda

sto facendo una managrer di backup per la mia app (via iCloud). Ho fatto alcuni test e le nozioni di base lavorato. Ma pochi giorni dopo si è fermato. Sto utilizzando NSMetadataQuery per la ricerca, se esiste il file di backup. I miei file di backup vengono denominati per esempio Backup29112011154133.xml , dove numeri rappresentano la data del backup (formattati come ddMMyyyyHHmmss ). I check in in -viewDidAppear:

- (void)viewDidAppear:(BOOL)animated {
    [self checkForRemoteFile];
}

- (void)checkForRemoteFile {
    NSURL *ubiq = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
    if (ubiq) {
        NSMetadataQuery *query = [[NSMetadataQuery alloc] init];
        [query setSearchScopes:[NSArray arrayWithObject:NSMetadataQueryUbiquitousDocumentsScope]];
        NSPredicate *pred = [NSPredicate predicateWithFormat:@"%K like 'Backup*'",NSMetadataItemFSNameKey];
        [query setPredicate:pred];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(queryDidFinishGathering:) name:NSMetadataQueryDidFinishGatheringNotification object:query];
        [query startQuery];
    } else {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"iCloud is unavailable at the moment" message:nil delegate:self cancelButtonTitle:@"Close" otherButtonTitles:nil];
        [alert setTag:TAG_ALERT_NOICLOUD];
        [alert show];
    }
}

- (void)queryDidFinishGathering:(NSNotification *)notif {
    NSMetadataQuery *query = [notif object];
    [query disableUpdates];
    [query stopQuery];
    [self loadRemoteFile:query];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:NSMetadataQueryDidFinishGatheringNotification object:query];
}

- (void)loadRemoteFile:(NSMetadataQuery *)query {
    if ([query resultCount] == 1) {
        canRestore = YES;
        NSMetadataItem *item = [query resultAtIndex:0];
        // parse the backup file
        [self.tableView reloadData];
    } else {
        canRestore = NO;
        modifDate = @"never";
        backupInfoLoaded = YES;
        [self.tableView reloadData];
    }
}

Il problema è che - (void)queryDidFinishGathering:(NSNotification *)notif non viene mai eseguito. Ho messo breakpints e NSLogs non litio, ma nulla accadesse.

anche cercato di verificare la presenza di altre notifiche esempio 'Interrogazione ha cominciato la raccolta' e 'processo di query'. Solo 'interrogazione ha inizio' la notifica è distaccato.

Ho anche AppID con iCloud registrati e diritti file allegato.

Mi potete aiutare cosa sta succedendo? Forse ho perso qualcosa?

È stato utile?

Soluzione 2

FISSA creando ivar per NSMetadataQuery.

Non so il motivo per cui l'applicazione non può leggere i dati senza NSMetadataquery Ivar.

Altri suggerimenti

Prima di tutto NSMetadataQuery non funziona se startQuery è stato chiamato non dal MaintThread. V'è la possibilità che il predicato fallisce per ogni percorso anche. A seguito di lavori di codice per me.

NSURL *mobileDocumentsDirectoryURL = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
...
query.predicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"%%K like \"%@*\"", [mobileDocumentsDirectoryURL path]], NSMetadataItemPathKey];
[query startQuery];

Purtroppo ci sono stati molti problemi con iCloud e con NSMetaDataQuery. Per essere onesto con voi la migliore fonte fin d'ora per tutte le vostre domande relative iCloud è l'Apple Developer Forum. Oggi Apple ha rilasciato iOS 5.1 beta, e le note di rilascio STILL dire che NSMetaDataQuery non funziona correttamente. E 'estremamente frustrante che iCloud ancora non funziona correttamente, ma purtroppo non c'è niente che possiamo fare.

Questo problema persiste. Sono stato in grado di rintracciare al seguente divergenza:

  • Se si limita la ricerca predicato sulla query al tasto nome,

per esempio

[NSPredicate predicateWithFormat:@"%K like[cd] %@", NSMetadataItemFSNameKey, @"*"]

allora funzionerà come previsto (distacco tutte e quattro le notifiche di query del ciclo di vita).

  • Se, tuttavia, si tenta sia un predicato composto o provare a lavorare con il percorso,

come in

[NSPredicate predicateWithFormat:@"%K BEGINSWITH %@", NSMetadataItemPathKey, [self cloudDocumentsURL].path]

o

[NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:namePred, pathPred, nil]];

Poi solo la notifica iniziale verrà pubblicato.

Ho provato letteralmente centinaia di combinazioni di queste variabili configurabili in test a risposta multipla e destinati per la produzione di applicazioni nel corso dell'ultimo anno e devono ancora trovare un controesempio a questa ipotesi.

Purtroppo, NSMetadataQuery fa proprio non funziona per i negozi onnipresente (al 10,8).

La mia soluzione è quella di ottenere i risultati grezzi della query e il lavoro per lo più su un NSArrayController rilegato che può avere i suoi risultati filtrati. Ciò significa refactoring lontano da query.results per la maggior parte del codice esistente e non v'è un calo di prestazioni (presumibilmente), ma è l'unico modo che ho trovato. Mi piacerebbe un'alternativa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top