【问题标题】:Is there a better way to check for a newer file than my implementation?有没有比我的实现更好的方法来检查更新的文件?
【发布时间】:2012-11-25 18:17:43
【问题描述】:

我有一个应用程序可以下载每隔几个月更新一次的 PDF,每次下载某个 PDF 时,我还会下载一个包含一个字符的 .txt 文件。每次我在服务器上上传更新的 PDF 时,我也会将服务器上 .txt 文件中的字符数加一。

当用户在我的应用程序中点击“更新”按钮时,我会将来自服务器的 .txt 文件中的字符串与本地 .txt 文件的字符串进行比较。

这是一种非常轻量级的检查新 PDF 是否可用的方法,但我想问是否有更好的方法或更轻松的方法来执行此操作,而无需为我创建的每个 PDF 文件创建一个 .txt 文件我的服务器上有吗?

提前感谢您提供的任何帮助!

这是我用来检查新 PDF 的代码:

NSString *documentDirectory = [(AppDelegate *)[[UIApplication sharedApplication] delegate] applicationDocumentsDirectory];

NSString *path = [documentDirectory stringByAppendingPathComponent:@"test.txt"];

NSString *server = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"foo.com/test.txt"] encoding:NSASCIIStringEncoding error:nil];

NSString *local = [NSString stringWithContentsOfFile:path encoding:NSASCIIStringEncoding error:nil];

if(![local isEqualToString:server])
{
   // I Download the new PDF and the new .txt file here;
   // simple NSURLConnection stuff, no need to elaborate
}

【问题讨论】:

    标签: objective-c ios nsstring nsfilemanager


    【解决方案1】:

    在我的脑海中,HTTP HEAD 方法可用于仅获取标头而不是数据。如果标题中的创建日期晚于您下载数据的最后日期,则该获取新副本了。这可以通过NSURLRequestNSURLConnection 完成。

    如果您的服务器不支持HEAD 请求或其他原因阻止了它的使用,您可以有第二个 TXT 文件,其中包含版本/哈希/唯一标识符。下载它并与存储的值进行比较。如果更改,请下载完整的 PDF 并将版本文本文件保存到磁盘以供以后参考。

    如果安全是一个问题并且您需要能够信任服务器,请在任一情况下使用 HTTPS。

    【讨论】:

    • 对于大约 100 兆字节的大型 PDF,http HEAD 响应有多轻量级?另外,我使用 Amazon 的 S3 进行存储。
    • HEAD 请求非常快,因为响应没有真实数据,只有 HTTP 标头
    • 真正的问题是,如何将 HEAD 请求与存储的本地 PDF 文件中的某种元数据进行比较?
    • @aviatorken89 愿意分享吗?我在 objc 中寻找可以检查服务器上 pdf 文件的修改日期的东西。
    • @Jorgen,我使用了 S3 上可用的 Etag 属性。我只是存储了所有 Etag 的本地 plist,然后进行比较。 ` NSString *serverETag = [[(NSHTTPURLResponse *)response allHeaderFields] objectForKey:@"Etag"];`
    猜你喜欢
    • 1970-01-01
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多