Почему NSMetadataQueryDidUpdateNotification вызывается несколько раз подряд?

Чтобы отслеживать изменения файлов в моем контейнере iCloud, я зарегистрировался на

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

В идеале, всякий раз, когда я получаю сообщение о том, что были сделаны обновления, я хотел бы открыть каждый из своих UIDocs и проверить, были ли изменены настройки. Это было бы хорошо, если бы NSMetadataQueryDidUpdateNotification вызывался только один раз. Однако он запускается несколько раз (я не забыл removeObserver и т. д., и у меня запущено несколько экземпляров), и поэтому было бы крайне непрактично загружать все файлы каждый раз, когда запускается уведомление об обновлении (если бы у меня было 5 файлов и это вызывается 4 раза, я бы быстро открыл 20 UIDocs). Например, это происходит, если я обновляю один файл (и в моем вездесущем контейнере есть только один файл):

2012-07-05 10:51:39.565 Meernotes[7842:707] ... NSMetadataQuery update
2012-07-05 10:51:42.468 Meernotes[7842:707] ... NSMetadataQuery update
2012-07-05 10:51:45.216 Meernotes[7842:707] ... NSMetadataQuery update
2012-07-05 10:51:47.036 Meernotes[7842:707] ... NSMetadataQuery update

Есть ли другой способ определить, когда файл изменился? NSFileVersion тоже не сильно помог.


person n.evermind    schedule 05.07.2012    source источник


Ответы (1)


NSMetadataQueryDidUpdateNotification выдает каждый раз, когда обновляются некоторые из атрибутов любого NSMetadataItem в NSMetadataQuery результатах. Он включает в себя частичную загрузку или прогресс загрузки. Поэтому неправильно пытаться открыть экземпляр UIDocument во время обработки этого уведомления.

Вместо этого вы можете определить момент загрузки документа, наблюдая за значениями атрибута NSMetadataItem, а затем поставить его в очередь для открытия.

Не забудьте также обработать NSMetadataQueryDidFinishGatheringNotification. Он публикуется, когда получатель заканчивает с первоначальным результатом — фаза сбора запроса.

person voromax    schedule 21.07.2012
comment
Думаю, вопрос Как следить за изменениями в iCloud? все равно останется. - person ThE uSeFuL; 05.03.2013