Как очистить / очистить кеш NSString - PullRequest
2 голосов
/ 29 августа 2011

В настоящее время я делаю простые тесты своего приложения (написанного на xCode для MAC OS X) и заметил, что существуют некоторые проблемы, связанные с получением данных из Интернета. Поэтому я запрашиваю некоторые текстовые данные:

NSString *dataFromInternet = [[NSString alloc] initWithContentsOfURL:url
                                                 usedEncoding:&encoding 
                                                        error:&error];

Сейчас:

  1. Если интернет работает, то все замечательно.

  2. Если интернет отключен, я получаю сообщение об ошибке «error», однако «dataFromInternet» по-прежнему возвращает те же данные, как если бы было подключение к Интернету

  3. Если я запрашиваю данные (код выше), когда интернет отключен, а затем подключаюсь к интернету и снова запрашиваю данные, я все равно получаю сообщение об ошибке, как будто интернет не работает!

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

Пожалуйста, объясните это (# 2 и # 3) странное поведение и как это исправить. Спасибо.

Ответы [ 2 ]

1 голос
/ 04 сентября 2011

Хорошо, поэтому после некоторого роуминга по Интернету и попытки найти ответ на мой вопрос вот что я придумал:

NSString *dataFromInternet = [[NSString alloc] initWithContentsOfURL:url
                                             usedEncoding:&encoding 
                                                    error:&error];

Выше код, похоже, использует кеш.Чтобы получать данные из Интернета и не иметь всех проблем, которые публикуются в вопросе, вы должны использовать другой объект.

NSData* data = [[NSData alloc] initWithContentsOfURL:url options:NSUncachedRead error:&error];
NSString *dataFromInternet = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

Что происходит в приведенном выше примере кода?Вы получаете данные из Интернета почти так же, как и с NSString, за исключением того, что вы указываете следующее: «options: NSUncachedRead» - это означает, что он не будет кэшировать данные и всегда будет считывать самые последние и самые лучшие данные - при условии, что интернет работает.

Как только вы получили данные, при желании вы можете преобразовать их в NSString.Мне нужен NSString, поэтому я преобразовал его обратно в то, что я хочу.В противном случае все проблемы в оригинальном сообщении будут решены!

Я могу отключить аэропорт на моем Mac, и данные не будут получены, и как только я включу аэропорт, данные снова будут передаваться.Очень просто и прекрасно работает для меня.

Спасибо.

0 голосов
/ 29 августа 2011

Так что я не могу это воспроизвести.С этим кодом:

NSError *error = nil;
NSStringEncoding encoding = 12345678; // known bad value
NSString *test = [[NSString alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://www.example.com/non-existant-page.html"] usedEncoding:&encoding error:&error];
if (test == nil) {
    NSLog(@"didnt work:%@, enc=%d, error:%@",test, encoding, error);
} else {
    NSLog(@"worked:%@, enc=%d, error:%@", test, encoding, error);
}

... и без интернета, я получаю это:

2011-08-28 22:30:45.482 test[48578:207] didnt work:(null), enc=12345678, error:Error Domain=NSCocoaErrorDomain Code=256 "The operation couldn’t be completed. (Cocoa error 256.)" UserInfo=0x5b09280 {NSURL=http://www.example.com/non-existant-page.html}

Я также запустил это после делая это с Интернет, чтобы подтвердить, что он не был кэширован (это не так), поэтому я не вижу, как вы могли получить результат.Можете ли вы дать нам больше кода, который вы использовали?

...