Демон iCloud медленно загружает изменения, сделанные в автономном режиме - PullRequest
2 голосов
/ 08 марта 2012

Кажется, что демон iCloud загружает изменения в течение нескольких секунд на сервер iCloud, когда изменения сделаны, когда устройство подключено к сети.Тем не менее, я заметил, что когда изменения выполняются в автономном режиме в локальном контейнере iCloud, а затем устройство переходит в оперативный режим, демон iCloud не работает при загрузке изменений.После восстановления соединения возникают задержки от нескольких секунд до 30 минут, после чего изменения загружаются на сервер iCloud и обнаруживаются другими устройствами.Это нормально?Любой способ сообщить демону iCloud о принудительной загрузке?

Я использую только подкласс UIDocument (для создания, открытия, изменения, сохранения файла в контейнере iCloud) и NSMetadataQuery для обнаружения изменений.После возврата в оперативный режим состояние файла для ключа NSURLUbiquitousItemIsUploadedKey имеет значение false и может оставаться таким в течение длительного времени.Я попытался повторно сохранить файл, чтобы заставить демон iCloud загрузить изменения, но, похоже, это не помогло.

1 Ответ

0 голосов
/ 18 августа 2013

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

Если вы используете метод getResourceValue:forKey:error: NSURL, который, я полагаю, вы используете, потому что вы упомянули об использовании NSURLUbiquitousItemIsUploadedKey, вы можете увидеть файлы , по-видимому , не загружаемые, потому что NSURL кэширует значение ресурса при особых обстоятельствах.

Не упоминается нигде в основных документах, но если вы погрузитесь в NSURL.h, вы найдете следующий странно сформулированный драгоценный камень, который стоит прочитать полностью, чтобы дать возможность понять последствия:

Поведение кэширования значения ресурса немного отличается между API NSURL и CFURL.

Когда методы NSURL, которые получают, устанавливают или используют кэшированные значения ресурсов используются из основного потока, значения ресурсов кэшируются URL (за исключением тех, которые добавлены как временные свойства) становятся недействительными следующие время выполнения цикла выполнения основного потока.

Функции CFURL не очищают автоматически значения ресурсов кэшируется по URL. Клиент имеет полный контроль над кешем продолжительность жизни. Если вы используете CFURL API, вы должны использовать CFURLClearResourcePropertyCacheForKey или CFURLClearResourcePropertyCache для очистки кэшированных значений ресурсов.

Возвращает значение ресурса, указанное данным ключом ресурса. это Сначала метод проверяет, кэширует ли ресурс объект уже значение. Если это так, он возвращает кэшированное значение ресурса вызывающей стороне. Если нет, тогда этот метод синхронно получает значение ресурса из резервное хранилище добавляет значение ресурса в кэш объекта URL, и возвращает значение ресурса вызывающей стороне. Тип ресурса значение зависит от свойства ресурса (см. определения ключа ресурса). Если этот метод возвращает YES и значение заполняется нулем, это означает, что свойство ресурса недоступно для указанного ресурса и отсутствует Произошли ошибки при определении свойства ресурса не было имеется в наличии. Если этот метод возвращает NO, заполняется необязательная ошибка. Этот метод в настоящее время применим только к URL для файловой системы Ресурсы. Символ присутствует в iOS 4, но не выполняет никаких операций.

В основном, если вы используете getResourceValue: на любой поток, отличный от основного потока , он будет кэшировать первый результат и возвращать этот же результат вам снова и снова . Интуитивно понятно, а? Как вы думаете, такие вещи будут отмечены жирным шрифтом в документах, а не скрыты в заголовке ...

Для меня это проявилось в том, что устройства иногда «зависали», поскольку они думали, что определенный URL-адрес не загружается, хотя в действительности это было много лет назад. Перезапуск приложения часто появился , чтобы решить эту проблему. Принудительное выполнение getResourceValue:forKey:error: только на главном потоке окончательно избавилось от этого рывка одним махом.

...