NSMetadataQuery non finisce raccolta (senza notifica)
-
25-10-2019 - |
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?
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.