【问题标题】:How to purge / flush cache of NSString如何清除/刷新 NSString 的缓存
【发布时间】:2014-01-04 11:10:02
【问题描述】:

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

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

现在:

  1. 如果互联网可以正常工作,那么一切都很棒。

  2. 如果互联网断开连接,则“错误”中出现错误,但“dataFromInternet”仍返回与互联网连接相同的数据

  3. 如果我在 Internet 断开连接时请求数据(以上代码),然后再次连接 Internet 并请求数据,我仍然会收到错误,好像 Internet 无法正常工作一样!

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

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

【问题讨论】:

  • 从 Internet 下载数据的最佳方式是使用 NSURLConnection。 (bit.ly/mGXAun)
  • 我稍后试试,谢谢。

标签: url caching nsstring osx-leopard


【解决方案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];

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

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

我可以在我的 mac 上关闭机场,并且不会收到任何数据,一旦我打开机场,数据就会再次流动。非常简单,对我来说效果很好。

谢谢。

【讨论】:

    【解决方案2】:

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

    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}
    

    我也在 之后运行了这个 with internet 以确认它没有被缓存(它不是),所以我不明白你是怎么做的本来可以得到结果的。您能否提供更多您使用的代码?

    【讨论】:

    • 好的,这里是模拟的详细信息。 1)尝试从互联网获取真实数据(真实链接) 2)不要重新加载应用程序,制作一个具有调用功能的应用程序来执行操作。 3)程序运行时,打开机场,点击动作(调用方法)。然后关闭机场并再次单击该操作。让我知道情况如何。
    • 我得到了和第一次一样的东西,即使在模拟器中也是如此。您可能需要发布更多代码。
    • 模拟器??? Ops 忘了说它是 Mac OS X 应用程序,而不是 iphone 应用程序。
    猜你喜欢
    • 2018-11-17
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 2023-01-29
    • 2020-09-05
    • 1970-01-01
    • 2019-08-02
    • 2012-05-19
    相关资源
    最近更新 更多