Запрос iCloud с NSMetadataQueryUbiquitousDocumentsScope не удается обновить - PullRequest
5 голосов
/ 09 ноября 2011

У меня есть рабочая установка между двумя приложениями (одно 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, удалить приложение из «Документы и данные» в Настройках на обоих компьютерах, повторно загрузить оба приложения, и «эта проблема возникнет» снова в любое время ". Я пытаюсь встроить избыточность в приложение.

Спасибо!

...