Загрузка ресурсов по требованию без ошибок на iOS, но недоступна - PullRequest
1 голос
/ 12 октября 2019

Наше приложение работает каждый раз без помех на всех устройствах iOS, с которыми мы тестировали (свежая установка или обновление из xcode / adhoc production / debug, мы попробовали их все). Но он отклоняется при рассмотрении приложения, потому что кажется, что ресурс ondemand никогда не становится доступным, даже если загрузка ресурса завершается без ошибок.

Мы обращаемся к ресурсу в области блокировки обратного вызова камеры. Если ресурс доступен, мы продолжаем и используем его, в противном случае мы делаем beginAccessingResourcesWithCompletionHandler () и бесплатный блок обратного вызова только после завершения загрузки. Проблема в том, что рецензент приложения говорит, что он загружается (для него есть индикатор выполнения), а затем постоянно просит повторную загрузку. Почему он не будет доступен, если он только что успешно завершил загрузку (заметьте, что ошибки нет)?

[request conditionallyBeginAccessingResourcesWithCompletionHandler:^(BOOL resourcesAvailable) {
if (resourcesAvailable)
{
    /* use the resource. */
    /* unblock the callback. done. */
}
else
{
    /* ask to download resource */
    [request beginAccessingResourcesWithCompletionHandler:^(NSError * _Nullable error) {
        if (error)
        {
            NSLog(@"%@", error);
            /* don't unblocked. return. will hang. */ 
        }
        /* unblock the callback. done. resource should be available next camera frame. */
    }];
} }];

Также это не проблема нехватки памяти. Мы это осветили и протестировали. Более того, beginAccessingResourcesWithCompletionHandler () возвращается без ошибок.

Ответы [ 2 ]

0 голосов
/ 19 октября 2019

После 9 заявок этот вопрос решен для нас. Но, к сожалению, не ясно, какие изменения были необходимы для его решения. Кроме того, это было рядом с обновлением 13.2.3 тоже. В целом, я бы удостоверился в этом (обратите внимание, что есть много примеров с положительным голосом по SO, которые не следуют им): 1) Все вызов beginAccess выполняется в главном потоке. 2) Не используйте повторно resourceRequest между условно BeginAcces и beginAccess. (как указал Мэтт). Переопределять их по имени тега каждый раз. 3) Убедитесь, что resourceRequest определены так, что они не выходят за рамки, пока не будет завершен весь процесс. Возможно, что на устройствах-рецензентах есть фоновый демон, который мгновенно удаляет освобожденные ресурсы (из-за выхода из области видимости). 4) если к odr обращаются внутри блока dispatch_sync (), убедитесь, что нет пути для одновременного запуска beginAccess.

0 голосов
/ 14 октября 2019

Я собираюсь догадаться, что проблема заключается в том, что в документации не учитывается предупреждение большими буквами :

Объект NSBundleResourceRequest может использоваться только для одногоуспешный запрос ресурса.

Нельзя повторно использовать объект запроса ресурса пакета. У него есть только два задания: загружать ресурсы (один раз) и удерживать их на месте (сохраняя). После того как вы успешно загрузили ресурсы один раз, вы можете сделать с этим объектом запроса ресурсов пакета только две вещи (и вы можете сделать их оба):

  • Вызов endAccessingResources.

  • Выбросьте объект (или выйдите из области видимости или умрите с прекращением работы приложения).

Если хотитеЧтобы снова узнать, при том же запуске приложения, есть ли у вас эти ресурсы, вам нужно начать все сначала с нового запроса ресурсов пакета.

Однако я бы пошел дальше. Как я уже сказал в комментариях, вы, кажется, неправильно используете conditionallyBegin. Нет необходимости спрашивать дважды во время одного и того же запуска приложения, есть ли у вас эти ресурсы, и нет необходимости вызывать conditionallyBegin, чтобы узнать это, потому что когда вы говорите beginAccessing,произойдет правильное: либо вы начнете использовать ресурсы (если они есть), либо загрузите их и начнете их использовать (если их не было). Единственная причина для использования conditionallyBegin заключается в том, что ваша логика будет отличаться от той, если окажется, что некоторые ресурсы отсутствуют.

...