iPhone - 检查文件是否需要更新/更新

时间:2011-03-21 02:40:07

标签: iphone download nsurl

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

我正在使用NSURL并且下载文件非常困难。

提前致谢

3 个答案:

答案 0 :(得分:6)

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 */
    }];
    
  3. 其中任何一项都需要在[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. */
    

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您可以将这些标记用于asihttprequest

[request setDownloadCache:[ASIDownloadCache sharedCache]];     [请求setCachePolicy:ASIAskServerIfModifiedCachePolicy | ASIFallbackToCacheIfLoadFailsCachePolicy];     [请求setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy];     [请求addRequestHeader:@“Cache-Contro”值:@“no-cache”];

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