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
и теперь, похоже, работает отлично. Я надеюсь, что это поможет людям в будущем!