NSMetadataQuery говорит, что нет документов, несмотря на успешную синхронизацию данных?

Я пытаюсь заставить мое приложение OS X автоматически обновляться после внесения изменений в документ iCloud, и мне очень трудно заставить работать уведомление. В частности, мне дали код, который должен перечислить все результаты моего NSMetadataQuery (только чтобы я мог провести некоторое тестирование и подтверждение), но он возвращает 0 результатов. И это несмотря на то, что в моем контейнере повсеместно есть что-то, потому что данные успешно загружаются из моего приложения OS X и снова успешно загружаются при запуске. Вот что у меня есть сейчас.

CloudDocument.h:

@property (nonatomic, strong) NSMetadataQuery *alertQuery;

CloudDocument.m:

@implementation CloudDocument

@synthesize alertQuery;

-(id)init {
    self = [super init];
    if (self) {
        alertQuery = [[NSMetadataQuery alloc] init];
        if (alertQuery) {
            // Search the Documents subdirectory only.
            [alertQuery setSearchScopes:[NSArray arrayWithObject:NSMetadataQueryUbiquitousDocumentsScope]];

            // Add a predicate for finding the documents.
            NSString *filePattern = @"*";
            [alertQuery setPredicate:[NSPredicate predicateWithFormat:@"%K LIKE %@", NSMetadataItemFSNameKey, filePattern]];
        }

        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(queryDidUpdate:) name:NSMetadataQueryDidFinishGatheringNotification object:nil];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(queryDidUpdate:) name:NSMetadataQueryDidUpdateNotification object:nil];

        NSLog(@"Notification created");

        [alertQuery startQuery];
    }
    return self;
}

-(void)queryDidUpdate:(NSNotification *)notification {
    [alertQuery disableUpdates];

    NSLog(@"Something changed!!! - %@", [notification name]);

    // Look at each element returned by the search
    // - note it returns the entire list each time this method is called, NOT just the changes
    int resultCount = (int)[alertQuery resultCount];
    NSLog(@"%i", resultCount);
    for (int i = 0; i < resultCount; i++) {
        NSMetadataItem *item = [alertQuery resultAtIndex:i];
        [self logAllCloudStorageKeysForMetadataItem:item];
    }

    [alertQuery enableUpdates];
}

- (void)logAllCloudStorageKeysForMetadataItem:(NSMetadataItem *)item {
    NSLog(@"LogAll gets called");
    NSNumber *isUbiquitous = [item valueForAttribute:NSMetadataItemIsUbiquitousKey];
    NSNumber *hasUnresolvedConflicts = [item valueForAttribute:NSMetadataUbiquitousItemHasUnresolvedConflictsKey];
    NSNumber *isDownloaded = [item valueForAttribute:NSMetadataUbiquitousItemIsDownloadedKey];
    NSNumber *isDownloading = [item valueForAttribute:NSMetadataUbiquitousItemIsDownloadingKey];
    NSNumber *isUploaded = [item valueForAttribute:NSMetadataUbiquitousItemIsUploadedKey];
    NSNumber *isUploading = [item valueForAttribute:NSMetadataUbiquitousItemIsUploadingKey];
    NSNumber *percentDownloaded = [item valueForAttribute:NSMetadataUbiquitousItemPercentDownloadedKey];
    NSNumber *percentUploaded = [item valueForAttribute:NSMetadataUbiquitousItemPercentUploadedKey];
    NSURL *url = [item valueForAttribute:NSMetadataItemURLKey];

    BOOL documentExists = [[NSFileManager defaultManager] fileExistsAtPath:[url path]];

    NSLog(@"isUbiquitous:%@ hasUnresolvedConflicts:%@ isDownloaded:%@ isDownloading:%@ isUploaded:%@ isUploading:%@ %%downloaded:%@ %%uploaded:%@ documentExists:%i - %@", isUbiquitous, hasUnresolvedConflicts, isDownloaded, isDownloading, isUploaded, isUploading, percentDownloaded, percentUploaded, documentExists, url);
}

-(NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError {
    [Data setSyncProgressIndicators:NO];
    return [NSKeyedArchiver archivedDataWithRootObject:[Data getAllNotes]];
}

-(BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError {
    [Data setSyncProgressIndicators:YES];
    NSDictionary *dict = (NSDictionary *)[NSKeyedUnarchiver unarchiveObjectWithData:(NSData *)data];
    [Data didReceiveCloudData:dict];
    [Data setSyncProgressIndicators:NO];
    return YES;
}

+(BOOL)autosavesInPlace {
    return YES;
}

@end

Результаты, которые я вижу, таковы, что queryDidUpdate: при запуске вызывается 2-3 раза, все из NSMetadataQueryDidFinishGatheringNotification, Дело в том, что переменная "resultCount" всегда равна 0, поэтому logAllCloudStorageKeysForMetadataItem никогда не вызывается, и NSMetadataQueryDidUpdateNotification никогда не вызывается вообще, независимо от того, как часто я редактирую облачный документ.

Может ли кто-нибудь дать совет, почему поиск возвращает 0 результатов, несмотря на то, что файл явно синхронизируется взад и вперед? Или даже лучше, вы можете увидеть, что не так с кодом полностью, и что я могу сделать, чтобы получить NSMetadataQueryDidUpdateNotification на ходу и сообщаете мне, когда были внесены изменения в мой файл? Я сохраняю файл, кстати, используя метод:

+(NSURL *)notesURL {
    NSURL *url = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
    return [url URLByAppendingPathComponent:kAllNotes];
}

где "kAllNotes" = "заметки".

Заранее спасибо за вашу помощь!

РЕДАКТИРОВАТЬ: Обратите внимание, что когда я говорю, что синхронизация успешно, это не происходит из-за NSMetadataQuery. у меня есть cloudDoc = [[CloudDocument alloc]initWithContentsOfURL:[self notesURL] ofType:NSPlainTextDocumentType error:nil]; в другом месте, который загружает CloudDocument, так что я знаю, что там есть документ, и я знаю, что он изменяется в версии приложения для iOS, но NSMetadataQuery, который я пытаюсь освоить прямо сейчас, предназначен только для работы с NSMetadataQueryDidUpdateNotificationи ничего из этого, кажется, не работает правильно.

Кроме того, я определенно начинающий, поэтому фрагменты кода и примеры при внесении предложений очень, очень ценятся!

1 ответ

Решение

Хорошо, я нашел ответ: я сохранял свой файл в корневой папке, но искал в NSMetadataQueryUbiquitousDocumentsScope, Это должно было быть NSMetadataQueryUbiquitousDataScopeи теперь, похоже, работает отлично. Я надеюсь, что это поможет людям в будущем!

Другие вопросы по тегам