我正在尝试创建一个简单的应用程序来检查iPhone上的.txt文件是否需要更新。现在我正在检查上次修改的html标题,我想将其与我iPhone中的文件进行比较。如果网站的日期晚于iPhone上的文件,则iPhone会下载并替换该文件。
我正在使用NSURL并且下载文件非常困难。
提前致谢
答案 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]
,因为它很容易粘贴到示例代码中。你应该使用:
[request setDelegate:self]
然后在某个地方的当前班级中实施ASIHTTPRequestDelegate
协议来处理requestFinished:
和requestFailed:
,或一个块,您可以使用
进行设置[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. */
学习成为优秀程序员的一部分是能够使用和探索可用的文档和资源。我建议您阅读我已链接到的文档,在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表示您的响应中有一些新内容。