„reload“ срещу „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 зададено.

За да разбера какво означава това, погледнах раздела Дефиниции на полето на заглавката на спецификацията на HTTP 1.1. Раздел 14.9.4 „Контроли за проверка на кеша и презареждане“ гласи:

Клиентът може да посочи тези три вида действия, използвайки директиви за заявка за контрол на кеша:

Презареждане от край до край Заявката включва директива за контрол на кеша „без кеш“ или, за съвместимост с HTTP/1.0 клиенти, „Pragma: без кеш“. Имената на полетата НЕ ТРЯБВА да се включват с директивата без кеш в заявка. Сървърът НЕ ТРЯБВА да използва кеширано копие, когато отговаря на такава заявка.

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

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

От моя прочит на спецификацията изглежда, че reload() използва само max-age=0, така че може да доведе до получаване на кеширано, но валидирано копие на исканите данни, докато reloadFromOrigin() ще принуди да бъде получено ново копие от първоначалния сървър.

(Това изглежда противоречи на документацията за справка на заглавието/класа на Apple за двете функции в WKWebView. Мисля, че описанията за двете трябва да се разменят - подадох доклад за грешка/Радар 27020398 с Apple и ще актуализирам този отговор така или иначе, ако чуя обратно от тях...)

person user2067021    schedule 27.06.2016