如何清除/刷新NSString的缓存

时间:2011-08-29 01:43:08

标签: url caching nsstring osx-leopard

目前我正在对我的应用程序进行简单测试(用MAC OS X的xCode编写),我注意到从互联网获取数据时存在一些问题。所以我要求一些文本数据:

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

立即

  1. 如果互联网有效,那么一切都很棒。

  2. 如果互联网断开连接,那么我在“错误”中收到错误,但“dataFromInternet”仍会返回与互联网连接相同的数据

  3. 如果我在互联网断开连接时请求数据(上面的代码)然后连接互联网并再次请求数据,我仍然会收到错误,好像互联网不起作用!

  4. 我不明白这种行为以及发生了什么。我只能猜测有一些缓存机制,我现在不知道如何修复它。

    请解释这个(#2&#3)奇怪的行为以及如何解决它。 谢谢。

2 个答案:

答案 0 :(得分:1)

好的,所以经过一段时间在互联网上漫游并试图找到我的问题的答案后,我就提出了这个问题:

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];

以上示例代码中发生了什么?您从Internet获取数据的方式与使用NSString的方式几乎相同,除非您指定以下内容:“options:NSUncachedRead” - 意味着它不会缓存数据并始终读取最新且最好的 - 在互联网工作的条件下。

获得数据后,如果需要,可以将其转换为NSString。我需要NSString所以我把它转换回我想要的。否则原帖中的所有问题都解决了!

我可以在Mac上关闭机场,不会收到任何数据,一旦我打开机场,数据就会再次流动。很简单,对我来说很棒。

谢谢。

答案 1 :(得分:0)

所以我无法重复这个。使用此代码:

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}

我在 之后运行 本来可以得到一个结果。你能给我们更多你使用过的代码吗?