Меня это тоже интересовало. Глядя на источник 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