NSURLCaching с dataTask не может прочитать кэш обратно с помощью NSURLRequest в автономном режиме

Меня очень смущает система кеширования iOS. Это должно быть просто, но это не так (для меня). Я пишу приложение базы данных, которое обеспечивает внешний веб-доступ к ограниченному набору дополнительных справочных материалов в виде веб-страниц. Иногда пользователю может потребоваться доступ к внешним веб-страницам, когда он находится в поле, где нет WiFi или мобильных данных. Просто, подумал я, использовать URLCaching при переборе набора внешних страниц в то время, когда доступен Интернет. Затем используйте политику запросов NSURLRequestReturnCacheDataElseLoad. Итак, я создал общий кеш в AppDelegate, затем одноэлементную сессию:

    NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
    sessionConfig.URLCache = self->_myCache;
    sessionConfig.requestCachePolicy = NSURLRequestReturnCacheDataElseLoad;
    sessionConfig.HTTPMaximumConnectionsPerHost = 5;
    session = [NSURLSession sessionWithConfiguration:sessionConfig
                                            delegate:self
                                       delegateQueue:nil];

Затем заполните кеш с помощью dataTask (поскольку пробная версия downloadTask не заполнила кеш):

    NSURLSessionDataTask *myTask = [[NSURLSessionDataTask alloc] init];
do {
      myTask = [self.session dataTaskWithRequest:req];
      myTask.taskDescription = searchName; //Iterating several values of searchName
      [myTask resume]; } while ...searchNames...

Это заполняет кеш, о чем свидетельствуют cache.currentDiskUsage и cache.currentMemoryUsage. Запуск цикла веб-чтения после начальных выборок не приводит к дальнейшему увеличению размера кеша.

Вот проблема: Запуск этого фрагмента кода с отключенным интернетом не читает из кеша

NSURL *nsurl=[NSURL URLWithString:@"https:searchName"];
NSURLRequest *nsrequest = [NSURLRequest requestWithURL:nsurl cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:60.0];
[_webView loadRequest:nsrequest];

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

TIC TCP Conn Failed [1:0x6000028ce580]: 1:50 Err(50)

Нет ли совместимости кеша между HTTP, если он заполнен dataTask и считывается из кеша с помощью NSURLRequest? Что я делаю не так? Есть ли другой подход к решению моей задачи дизайна?


person BlueskyMed    schedule 06.12.2018    source источник


Ответы (1)


После трех дней экспериментов я смог создать кеш примерно из трехсот веб-страниц (с соответствующими встроенными изображениями) и считывать их обратно из постоянной памяти при запуске приложения. Единственный подход к доступу к кешу — использовать метод NSURLCache cachedResponseForRequest:. Использование других форм доступа к URL-адресу с соответствующей CachePolicy, похоже, не работает.

Кажется, есть неприятный побочный эффект метода cachedResponseForRequest:, заключающийся в том, что он передает только исходный html-документ в wkwebview, и ни один из связанных ресурсов, которые проверены, также находятся в моем кеше.

У кого-нибудь есть предложения, чтобы получить этот предел?

person BlueskyMed    schedule 13.12.2018