2014-09-08 2 views
1

Я использую эту строку, чтобы получить содержимое URL:Предотвращение initWithContentsOfURL: от использования кэша

NSString *result=[[NSString alloc] initWithContentsOfURL:[NSURL URLWithString:URL] 
               encoding:NSUTF8StringEncoding 
                error:nil]; 

Проблема заключается в том, когда есть плохое соединение, он загружает содержимое из кэша. Есть ли способ избежать такого поведения? Например, очистка кеша или что-то еще.

+1

В любом случае вы не должны использовать 'initWithContentsOfURL:' для сетевых операций. Используйте 'NSURLRequest'. –

+1

Если вы используете NSURLRequest, вы можете отключить кеширование, так что ничто никогда не будет кэшироваться. –

ответ

1

Во-первых, не рекомендуется использовать initWithContentsOfURL:encoding:error для загрузки данных с сетевого ресурса.

Во-вторых, если вы хотите контролировать поведение кэширования, вы должны использовать NSURLRequest. NSURLRequest позволяет настроить поведение кэширования запроса, установив cachePolicy запроса. В вашем случае вы хотите использовать NSURLRequestReloadIgnoringLocalCacheData. Пример делать это синхронно с использованием NSURLConnection бы:

NSString  *result  = nil; 
NSData   *data  = nil; 
NSURLResponse *response = nil; 
NSURLError  *error  = nil; 
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:URL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:20L]; 
data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 
if (response != nil && [data length] > 0){ 
    result = [NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
} 

Обратите внимание, что это очень наивная реализация, которая не проверяет код состояния HTTP вернулся, мим-типа ответа, или выполнить любую обработку ошибок. Также не рекомендуется проводить синхронную загрузку сетевых ресурсов или сделать это из основного потока. Лучшая реализация будет использовать sendAsynchronousRequest:completion: или NSURLSession.

Однако он демонстрирует на высоком уровне то, что вам нужно будет сделать, чтобы ответить на ваш вопрос: NSURLRequest указывает, что этот запрос никогда не должен использовать локальный кеш, а возвращаемые данные используются для создания экземпляра NSString.

+0

ОК я использовал его и он работал нормально, но когда есть плохая связь, он по-прежнему загружает предыдущие результаты. Как вы думаете, сервер отвечает из своего кеша (если он существует). Я использую простой скрипт php, который перекликается с содержимым XML-файла. – user3981459

+0

Это возможно, особенно если ваш скрипт размещен за балансировщиком кэширования или CDN. Лучший способ устранить эту проблему - использовать прокси-сервер отладки, такой как Charles, и запустить его во время запуска вашего приложения. Вы сможете точно видеть, что происходит с сервера. – quellish

+0

Я решил это, добавив этот заголовок в свой скрипт: header («Cache-Control: no-cache, must-revalidate»); Большое вам спасибо за вашу помощь. – user3981459

0

Простой параметр-заглушка кеш-бастера со случайным значением, добавленным в URL-адрес, должен работать. И как @ Джош-Касуэлл сказал, используйте NSURLRequest. Хотя в случае прокси-серверов просто использование NSURLRequest может не помочь, и вам все равно понадобится кеш-бустер.

+0

Можете ли вы дать мне пример того, как загрузить строку из nsurlrequest, пожалуйста? – user3981459

+0

Почти полный источник здесь https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/URLLoadingSystem/Tasks/UsingNSURLConnection.html#//apple_ref/doc/uid/20001836-SW1 – ImplexOne