Frage

Ich erstelle einen Backup -Managrer für meine App (über iCloud). Ich habe einige Tests durchgeführt und die Grundlagen funktionierten. Aber ein paar Tage später hörte es auf. Ich benutze NSMetadataQuery Für die Suche, wenn Sicherungsdatei vorliegt. Meine Sicherungsdateien heißen EG Backup29112011154133.xml wobei Zahlen Datum der Sicherung darstellen (formatiert als ddMMyyyyHHmmss). Ich prüne danach 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];
    }
}

Das Problem ist, dass - (void)queryDidFinishGathering:(NSNotification *)notif wird nie ausgeführt. Ich habe dort Breakpints und NSLogs -Ionen gesetzt, aber nichts ist passiert.

Ich habe auch versucht, nach anderen Benachrichtigungen zu suchen, z. B. "Abfrage hat angefangen zu sammeln" und "Abfrageprozess". Es ist nur "Abfrage begann" -Meldungen veröffentlicht.

Ich habe mich auch bei iCloud registriert und berechtigten Datei angehängt.

Kannst du mir helfen, was los ist? Vielleicht habe ich etwas verpasst?

War es hilfreich?

Lösung 2

Behoben durch Erstellen ivar zum NSMetadataQuery.

Ich weiß nicht, warum die Anwendung keine Daten ohne NSmetadataquery IVAR lesen kann.

Andere Tipps

Zunächst einmal funktioniert NSmetadataquery nicht, wenn StartQuery nicht aus dem Wartungsthread aufgerufen wurde. Es besteht die Möglichkeit, dass Prädikat auch für jeden Weg fehlschlägt. Der folgende Code funktioniert für mich.

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

Leider gab es viele Probleme mit iCloud und verwendet NSMetaDataQuery. Um ehrlich zu sein, sind die Apple Developer -Foren für alle Ihre iCloud -Fragen die beste Quelle für alle Ihre iCloud -bezogenen Fragen. Heute hat Apple iOS 5.1 Beta und die Versionshinweise veröffentlicht STILL Sagen Sie, dass NSmetadataquery nicht richtig funktioniert. Es ist äußerst frustrierend, dass iCloud immer noch nicht richtig funktioniert, aber leider können wir nichts tun.

Dieses Problem bleibt immer noch bestehen. Ich konnte es auf folgende Divergenz verfolgen:

  • Wenn Sie Ihr Suchprädikat auf der Abfrage auf die Namenstaste einschränken,

zum Beispiel

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

Dann wird es wie erwartet funktionieren (alle vier Query -Lebenszyklus -Benachrichtigungen zu veröffentlichen).

  • Wenn Sie jedoch entweder ein zusammengesetztes Prädikat versuchen oder versuchen, mit dem Pfad zu arbeiten,

wie in

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

ODER

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

Dann wird nur die erste Benachrichtigung veröffentlicht.

Ich habe im letzten Jahr buchstäblich Hunderte von Kombinationen dieser konfigurierbaren Variablen in mehreren Test- und Absichtserzeugungs-Apps ausprobiert und habe noch kein Gegenbeispiel für diese Hypothese gefunden.

Leider funktioniert NSmetadataquery einfach nicht für allgegenwärtige Geschäfte (ab 10,8).

Meine Problemumgehung besteht darin, die Rohergebnisse aus der Abfrage zu erhalten und hauptsächlich an einem gebundenen NsarrayController zu arbeiten, bei dem die Ergebnisse filtern können. Dies bedeutet, von der Abfrage abzubauen. Ich würde eine Alternative lieben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top