Я справился с этой проблемой, реализовав уровень модели, через который проходят все запросы. Запросы ставятся в очередь и обслуживаются в приоритетном порядке, обычно по одному за раз. Я добавил специальные методы, позволяющие контроллеру повысить приоритет запросов, чтобы при необходимости два или более запросов были активными одновременно. Когда запрос завершается, он предупреждает своего делегата (контроллер WebView), что данные готовы для загрузки.
В зависимости от того, как вы хотите настроить вещи, вы можете поместить обратный вызов в "webViewDidFinishLoad" (или, возможно, shouldStartLoadWithRequest или webViewDidStartLoad), который вызывает уровень модели для удаления из очереди и обслуживания следующего запроса. В целях безопасности вам также понадобится тайм-аут на уровне модели.
Примечание: вам также нужно добавить некоторый пользовательский код в shouldStartLoadWithRequest, чтобы различать клики и слой модели, вставляющий данные. Т.е. вы хотите вернуть NO или YES в зависимости от навигационного типа.