【问题标题】:Adding a timestamp to NSURL为 NSURL 添加时间戳
【发布时间】:2012-05-12 20:16:13
【问题描述】:

我有一个文本视图,可以从我的服务器上的 .txt 下载文本。唯一的问题是它只会这样做一次——无论我是否更新 .txt 文件,文本都不会改变。

这是文本视图的代码:

- (void)viewDidLoad

{NSError *error = nil;
NSURL *myurl = [NSURL URLWithString:@"http://www.myserver.com/test.txt"];
NSString *mystring = [NSString stringWithContentsOfURL:myurl encoding:NSUTF8StringEncoding error:&error]; 
newtext.text = mystring;
}

似乎无法弄清楚如何让它在每次应用程序运行时检查服务器(而不仅仅是缓存它第一次找到的内容)。这会发生在模拟器和真正的 iPhone 上。

感谢您的帮助!

【问题讨论】:

    标签: iphone xcode ios5 xcode4


    【解决方案1】:

    我不相信您可以使用便捷方法 stringWithContentsOfURL 设置缓存策略。如果我错了,请有人纠正我。

    好消息是这很容易解决。只需创建自己的请求并将缓存策略设置为 NSURLRequestReloadIgnoringLocalCacheData。

    NSURL *myurl = [NSURL URLWithString:@"http://www.myserver.com/test.txt"];
    NSURLRequest *request = [NSURLRequest requestWithURL:myurl
                                             cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
                                         timeoutInterval:60.0];
    
    NSURLConnection *connection= [[NSURLConnection alloc] initWithRequest:request 
                                                                 delegate:self];
    

    然后在委托中设置文本视图。归根结底,这就是便利方法所做的事情。

    【讨论】:

    • 感谢您的回复!我试图合并你的代码,但我不确定我是否理解如何在委托中设置文本视图?
    • 参见此处以获取示例 NSURLConnection 实现。只需在 connectionDidFinishLoading 方法中设置您的文本视图。 stackoverflow.com/questions/2124421/…
    • 好的!给我猜个谜——这一切都有效,但只有当我首先在我的计算机浏览器中查看 txt 文件,然后 cntrl 单击刷新(以清除浏览器的页面缓存并强制重新加载)。然后(只有那时)iphone 也会拉出新文本。我觉得好像我失去了理智,但它有效!再次感谢大家的帮助!
    • 使用 NSURLRequestReloadIgnoringLocalAndRemoteCacheData 代替。我敢打赌,它会修复它。
    【解决方案2】:

    HTTP 缓存由Cache-Control HTTP 标头控制。如果您的文本文件经常更改,您应该配置您的服务器以为此发出合适的标头,例如Cache-Control: no-cache。更多详情,请阅读Mark Nottingham's caching tutorial

    【讨论】:

    • 感谢您的快速回复!我编辑了服务器 hta 访问文件以包含以下内容:<filesMatch "\.(xml|txt)$"> Header set Cache-Control "max-age=1, public, must-revalidate" </filesMatch> 但文本字段仍然不会加载新的 txt 文件的内容。
    • 您是否通过使用 curl 等工具手动执行请求来验证标头是否有效?您是否已通过诸如 Charles 之类的代理验证您的应用程序没有使用之前的缓存版本?你为什么选择 enable 缓存的 HTTP 标头?您是否尝试过使用完全禁用缓存的标头?
    • 嗨!我确实更改了 hta 访问文件以完全禁用缓存:<filesMatch "\.(xml|txt)$"> Header unset Cache-Control </FilesMatch> 但我不确定如何检查它是否与 Curl 一起使用。我在模拟器中重置了内容和设置,但它似乎仍然显示旧 txt 文件的内容。
    • curl --head http://example.com/ 应该显示标题,或者使用我链接到的教程中描述的 telnet 方法。完全取消设置Cache-Control 通常也具有启用缓存的效果。请阅读我链接到的教程。
    猜你喜欢
    • 1970-01-01
    • 2017-11-07
    • 2018-03-22
    • 2016-10-23
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 2019-01-25
    相关资源
    最近更新 更多