«перезагрузка» против «reloadFromOrigin» в WKWebView

В чем разница между reload и reloadFromOrigin в WKWebView? В документации Apple говорится, что reloadFromOrigin:

Перезагружает текущую страницу, выполняя сквозную повторную проверку с использованием условий проверки кэша, если это возможно.

Но я не уверен, что это на самом деле означает.


person Tarek    schedule 11.08.2015    source источник


Ответы (1)


Меня это тоже интересовало. Глядя на источник WebKit (Source/WebCore/loader/FrameLoader.cpp, FrameLoader::addExtraFieldsToRequest(...) вокруг условия if (loadType == FrameLoadType::Reload)), похоже, что ключевое различие заключается в том, какие дополнительные поля запроса HTTP-заголовка указаны.

reloadFromOrigin() устанавливает для полей Cache-Control и Pragma значение no-cache, в то время как простое reload() приводит только к тому, что в поле заголовка Cache-Control установлено значение max-age=0.

Чтобы понять, что это значит, я просмотрел раздел Header Field Definitions спецификация HTTP 1.1. В разделе 14.9.4 «Повторная проверка кэша и элементы управления перезагрузкой» говорится:

Клиент может указать эти три вида действий, используя директивы запроса Cache-Control:

Сквозная перезагрузка. Запрос включает директиву управления кешем "no-cache" или, для совместимости с клиентами HTTP/1.0, "Pragma: no-cache". Имена полей НЕ ДОЛЖНЫ быть включены в директиву no-cache в запросе. Сервер НЕ ДОЛЖЕН использовать кэшированную копию при ответе на такой запрос.

Конкретная сквозная повторная проверка Запрос включает директиву управления кешем "max-age=0", которая заставляет каждый кеш на пути к исходному серверу повторно проверять свою собственную запись, если таковая имеется, со следующим кешем или сервером. Первоначальный запрос включает в себя условие проверки кеша с текущим валидатором клиента.

Неуказанная сквозная повторная проверка. Запрос включает директиву управления кешем "max-age=0", которая заставляет каждый кеш на пути к исходному серверу повторно проверять свою собственную запись, если таковая имеется, с следующий кеш или сервер. Первоначальный запрос не включает условие проверки кеша; первый кеш на пути (если есть), который содержит запись кеша для этого ресурса, включает в себя условие проверки кеша с его текущим валидатором.

Судя по моему прочтению спецификации, похоже, что reload() использует только max-age=0, поэтому может привести к тому, что вы получите кэшированную, но проверенную копию запрошенных данных, тогда как reloadFromOrigin() заставит получить новую копию с исходного сервера.

(Кажется, это противоречит документации Apple по заголовку/классу для двух функций в WKWebView. Я думаю, что описания для этих двух функций следует поменять местами – я подал отчет об ошибке/радар 27020398 в Apple и обновлю этот ответ в любом случае, если услышу вернулся от них...)

person user2067021    schedule 27.06.2016