У меня есть рабочая установка между двумя приложениями (одно iOS, другое Mac), где они оба помещают файлы в контейнер ubiquity и оба контролируют этот контейнер с помощью NSMetadataQuery. В большинстве случаев запросы обновляются почти сразу после того, как для файла задано значение Повсеместно: ДА в каталоге.
Однако, в связи с другой неприятной ошибкой iCloud, которая может привести к полной очистке контейнера при синхронизации (автоматически, а не приложением или пользователем), как только «чистая настройка» между приложениями будет повреждена из-за указанной ошибки, запрос - только для iPhone - больше не обновляет.
Если я добавлю файлы в контейнер на iPhone, Mac увидит их немедленно. Но если я добавлю файлы на стороне Mac, iPhone никогда не обновится. Если я использую таймер и файловый менеджер для сканирования контейнера, я могу подтвердить, что файлы перечислены в содержимом. Это запрос, который не распознает их.
Хотя я не думаю, что это проблема кода, я включу ее сюда. Я думаю, что это проблема «iCloud - это бета-версия (в лучшем случае)», и мне интересно, может ли кто-нибудь ответить на этот вопрос: Поскольку при выходе и перезапуске приложения происходит корректный вызов запроса на обновление, кто-нибудь знает, как принудительно запрос NSMetadataQuery для обновления? Удаление его и создание другого ничего не делает.
Вот код запроса (я говорю, что он правильно сообщает на любые мониторы NSNotification):
self.query = [[[NSMetadataQuery alloc] init] autorelease];
[query setDelegate:self];
[query setSearchScopes:[NSArray arrayWithObject:NSMetadataQueryUbiquitousDocumentsScope]];
[query setPredicate:[NSPredicate predicateWithFormat:@"%K like[cd] %@", NSMetadataItemFSNameKey, @"*"]];
[query startQuery];
Вот код опроса (я говорю, он говорит, что в папке есть файлы):
- (void)pollUbiquitousStore:(NSTimer *)aUbiquitousStoreMonitor {
//Query update
NSArray *topLevelCloudContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[self.fileController.cloudFolderURL.path stringByAppendingPathComponent:@"Documents"] error:nil];
NSLog(@"known iCloud url: %@ contents: %@", self.fileController.cloudFolderURL, topLevelCloudContents);
Вот где я просматриваю запрос (я получаю результаты, КРОМЕ после того, как система подключена):
//Refresh
id queryGatheringObserver = [[NSNotificationCenter defaultCenter] addObserverForName:NSMetadataQueryGatheringProgressNotification object:aQuery queue:nil usingBlock:^(NSNotification *note) {
refresh((NSMetadataQuery *)[note object]);
}];
id queryUpdateObserver = [[NSNotificationCenter defaultCenter] addObserverForName:NSMetadataQueryDidUpdateNotification object:aQuery queue:nil usingBlock:^(NSNotification *note) {
refresh((NSMetadataQuery *)[note object]);
}];
Теперь вы, возможно, говорите: "Вы говорите, что это шланг, почему бы не начать все сначала?" На что я отвечаю - я не могу сказать пользователям, что им нужно удалить оба приложения с обоих устройств, отключить iCloud, удалить приложение из «Документы и данные» в Настройках на обоих компьютерах, повторно загрузить оба приложения, и «эта проблема возникнет» снова в любое время ". Я пытаюсь встроить избыточность в приложение.
Спасибо!