【问题标题】:iPhone - Checking to see if file needs update / updateiPhone - 检查文件是否需要更新/更新
【发布时间】:2011-03-21 02:40:07
【问题描述】:

我正在尝试制作一个简单的应用程序来检查 iPhone 上的 .txt 文件是否需要更新。现在我正在检查最后修改的 html 标头,我想将它与我的 iPhone 中的文件进行比较。如果网站的日期晚于 iPhone 上的文件,iPhone 会下载并替换该文件。

我正在使用 NSURL 并且很难下载文件。

提前致谢

【问题讨论】:

  • 您在哪个部分遇到了问题?哪些部分在工作?
  • 我可以从网站的 lastModified 标头中获取字符串;但是我非常不确定如何将其与 iphone 中的文件(.txt 文件)进行比较。

标签: iphone download nsurl


【解决方案1】:

ASIHTTPRequest 是一个库,它将 HTTP 请求和一堆直观检查(如代理身份验证、缓存等)封装在一个整洁的类中,它是 NSURLRequest 的扩展。我推荐使用这个,你可以从here 的可能选项中选择一个缓存策略。看起来你想要ASIAskServerIfModifiedCachePolicy,它总是询问服务器是否有更新的版本,并且只有在更新时才下载(它检查Last-Modified: 以及其他标题)。您还可以将此缓存策略与ASIFallbackToCacheIfLoadFailsCachePolicy 结合使用,这样如果联系服务器失败,仍将使用上次存储的版本。

示例代码:

#import "ASIHTTPRequest.h"
#import "ASIDownloadCache.h"

/* doing the actual check. replace your existing code with this. */
ASIHTTPRequest *request = [[ASIHTTPRequest alloc] initWithURL:myTxtFileURL];
[request setDownloadCache:[ASIDownloadCache sharedCache]];
[request setCachePolicy:ASIAskServerIfModifiedCachePolicy|ASIFallbackToCacheIfLoadFailsCachePolicy];
[request setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy];
[request startSynchronous];
NSString *latestText = [request responseString];
[request release];

请注意,我只使用[request startSynchronous],因为它很容易粘贴到示例代码中。你应该使用:

  1. [request setDelegate:self],然后在当前类的某处实现ASIHTTPRequestDelegate协议来处理requestFinished:requestFailed:,或者
  2. 一个可以设置的块

    [request setCompletionBlock:^
    {
        /* code to run after the download finishes */
    }];
    [request setFailedBlock:^
    {
        /* code to run if the download failed */
    }];
    

其中任何一个都需要在[request startSynchronous]之前完成,然后您需要将startSynchronous更改为startAsynchronous。查看“How to use it”选项卡上的更多文档链接。

编辑: 你说你想比较文件本身。我不明白你到底想要什么,但如果你想将旧文件中的内容与新文件中的内容进行比较,那么你需要先获取旧文件文本的副本。为此:

ASIHTTPRequest *request = [[ASIHTTPRequest alloc] initWithURL:myTxtFileURL];
[request setDownloadCache:[ASIDownloadCache sharedCache]];
[request setCachePolicy:ASIAskServerIfModifiedCachePolicy|ASIFallbackToCacheIfLoadFailsCachePolicy];
[request setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy];
NSStringEncoding encoding;
NSError *error = nil;
NSString *oldText =
[NSString stringWithContentsOfFile:[[ASIDownloadCache sharedCache] pathToCachedResponseDataForRequest:request]
                      usedEncoding:encoding
                             error:&error];
[request startSynchronous];
NSString *newText = [request responseString];
[request release];

/* now compare the NSString oldText to newText however you like. */

学习成为一名优秀程序员的一部分是能够使用和探索可用的文档和资源。我建议您阅读我链接到的文档,阅读 Apple 在 iOS 上的文档,或者在 Google 上搜索您的下一个问题。 Apple 文档中比较字符串的部分是here

【讨论】:

  • 感谢 darvidson,我会尝试检查 ASI;但是我将如何检查 iPhone 中物理文件的日期
  • 它检查的方式是将旧版本保存在缓存目录中,并且每当它在 Web 上查找文件时,它会将标头的 Last-Modified 与文件中文件的修改日期进行比较缓存目录。因此,基本上,它会为您进行检查:) 如果您将文件命名为 Text21032011 或类似名称,为了使其正常工作,我将删除日期,以便每个版本都具有相同的名称。这样它就会为你执行检查。
  • 不,[request startSynchronous] 开始并完成下载,latestText 字符串是文本文件的内容,所以下载已经完成。
  • darvids0n 你能详细说明一下我还打算如何检查和比较这些文件吗?
【解决方案2】:

一种选择是使用 HTTP 的ETag header 有条件地从服务器加载文件。您需要记住上次更新文件时的 ETag 值,但这并不难。您还需要一个配置为使用 ETags 的服务器;除非服务器完全不受您的控制,否则这也不难。

【讨论】:

    【解决方案3】:

    您可以将这些标签与您的 asihttprequest 一起使用

    [请求 setDownloadCache:[ASIDownloadCache sharedCache]]; [请求 setCachePolicy:ASIAskServerIfModifiedCachePolicy|ASIFallbackToCacheIfLoadFailsCachePolicy]; [请求 setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy]; [请求 addRequestHeader:@"Cache-Contro" value:@"no-cache"];

    然后检查您的完成块 "[request responseStatusMessage]" ,如果此字符串包含 304 表示您的响应未修改,否则字符串包含 200 表示您的响应中有一些新内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-31
      • 1970-01-01
      • 1970-01-01
      • 2018-06-04
      相关资源
      最近更新 更多