【问题标题】:How to cache content in UIWebView for faster loading later on?如何在 UIWebView 中缓存内容以便以后更快地加载?
【发布时间】:2010-11-23 20:05:57
【问题描述】:

我注意到 iphone safari 会缓存内容,因此您稍后的页面加载速度要快得多,就像桌面浏览器一样。以移动 gmail 网页为例,第一次加载很慢(5-10 秒)。但是如果我关闭选项卡并再次重新打开页面,它会非常快(1 秒)。

但是,如果您通过应用程序中的 UIWebView 加载内容,则此行为会有所不同。我错过了一些设置吗?如何让 UIWebView 自动缓存内容而无需自己保存内容的麻烦?

【问题讨论】:

    标签: iphone html objective-c ios


    【解决方案1】:

    关键是:NSURLRequestReturnCacheDataElseLoad

    NSData *urlData;
    NSString *baseURLString =  @"mysite.com";
    NSString *urlString = [baseURLString stringByAppendingPathComponent:@"myfile"];
    
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString] cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval: 10.0]; 
    NSURLConnection *connection=[[NSURLConnection alloc] initWithRequest:request delegate:nil]; 
    
    if (connection)
    { 
        urlData = [NSURLConnection sendSynchronousRequest: request];
    
        NSString *htmlString = [[NSString alloc] initWithData:urlData encoding:NSUTF8StringEncoding];
        [webView loadHTMLString:htmlString baseURL:baseURLString];
        [htmlString release];
    }
    
    [connection release];
    

    【讨论】:

    • iOS 文档说 NSURLRequestReturnCacheDataElseLoad “指定应该使用现有缓存数据来满足请求,无论其年龄或到期日期如何。”这通常不是您想要的,因为它忽略了诸如 max-age 等缓存策略标头。所以这听起来不是一个好的一般答案。看似最好的选择是“NSURLRequestUseProtocolCachePolicy”,但这似乎无济于事。
    【解决方案2】:
    NSString *stringurl=[NSString stringWithFormat:@"http://www.google.com"];
    NSURL *url=[NSURL URLWithString:stringurl];
    NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:15.0];
    [uiwebview loadRequest:theRequest];
    

    它将第一次加载一个 url,然后只查找内容更改..,如果 url 内容中没有更新,它将从缓存(本地存储)加载。

    【讨论】:

    • 你能解释一下吗?
    • 它会第一次加载一个 url,然后只查找内容更改..,如果 url 内容中没有更新,它将从缓存(本地存储)加载。
    • 是的,但是在回答时这样做
    【解决方案3】:

    基于this discussion threadUIWebView 似乎无法进行任何操作系统级缓存。根据经验,我注意到我的 iPhone OS 设备上的 Safari 不会缓存其网页(例如,在 Safari 中点击后退按钮不会从缓存中重新加载旧页面)。

    【讨论】:

    • 似乎缓存仅适用于离线时使用的 HTML 5 清单。
    【解决方案4】:

    我已经完成了几个将页面缓存到 Documents 文件夹的应用程序,然后在加载新网页之前比较缓存和网页的时间戳。所以基本流程是:

    if (fileIsInCache)
        if (cacheFileDate > webFileDate)
            getCachedFile
        else
            getFileFromWeb
            saveFileToCache
    else
        getFileFromWeb
        saveFileToCache
    
    stuffFileIntoUIView
    
    maybeReduceCache
    

    您仍然需要访问网络来获取标题,但这通常比下载整个页面/图像/文件要快得多。

    【讨论】:

      猜你喜欢
      • 2010-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-27
      相关资源
      最近更新 更多