• Understanding Cache Access


    URL Loading System提供了综合的disk 和 in-memory 策略的请求缓存。使用缓存有利于减少程序对网络的依赖,并且能提高程序的体验。

    Using the Cache for a Request

    在NSURLResquest实例中使用一个NSURLRequestCachePolicy值,去制定怎么样本地的缓存的策略。

    NSURLRequestUseProtocolCachePolicy, 使用协议默认,自动默认的的会提供比较合适的策略。

    NSURLRequestReloadIgnoringCacheData,使用网络数据,不是使用缓存的数据

    NSURLRequestReturnCacheDataElseLoad,使用缓存数据,不管缓存数据的时间和截止日期,如果实在找不到,再用网络。

    orNSURLRequestReturnCacheDataDontLoad.让网络的请求中,只有本地有数据缓存的才返回数据。如果本地没有缓存的数据,那么即便创建NSURLConnection或者NSURLDownload去请求也是不行的。这个有点离线的意思。

    当前只有HTTP和HTTPS request是被缓存的,FTP和file 协议会尝试去获取originating数据在cache policy允许的情况下。定义NSURLProtocol类,可以选择行进行缓存。

    Cache Use Senmantics for the HTTP Protocol

     日常中比较复杂的的缓存使用情况是,当一个请求是用HTTP协议并且和设置缓存的策略为NSURLReqestUseProtocolCachePolicy。

    如果一个request并没有NSCacheURLResponse,那么URL loading系统会从源数据出获取数据。

    如果request存在cache response,URL loading系统会检查这个response,然后再去决定这个request的内容是特殊的,需要重新去验证。

    如果content必须要重新验证,那么URL loading 系统会创建一个HEAD request去发给服务器,判断现有的资源有没有改变了。如果content没有改变,URL Loading系统会返回 cacheed response。如果变化了,URL Loading系统就重新获取数据。

    如果cached response 没有指定说必须需要去验证,那么URL Loading系统检查一下缓存的response存在的最大过期时间。如果缓存的response足够新,那么就直接返回,如果不够新,就发送一个HEAD request给服务器,然后决定需要的resource是否已经改变,如果已经改变就就重新获取,如果没有改变就返回cached的response。

    Controlling Cache Programmatically

    默认情况下,连接产生的数据会依赖于request的cache policy的策略而缓存下来,就像NSURLProtocol子类控制的那样。

    如果你的程序需要精准的去控制你的缓存的数据(在protocol支持cache的情况下),你可以实现一个delegate的方法以允许使用一种pre-request(预请求)的方式决定request是否需要特别去缓存。

    对于你的NSURLSession来说,delagate方法调用completion handler block去告诉session,那些需要去被缓存。对于NSURLConnection,delegate返回那些连接过程中需要被缓存的对象。

    这两种例子中,delegate典型的提供下面之一的解决方案:

    • 提供provided response对象去允许caching
    • A newly created response object to cache a modified response—for example, a response with a storage policy that allows caching to memory but not to disk
    • NULL to prevent caching

    delagate尅把response对象存入到userinfo的字典中然后于NSCacheURLResponse对象建立联系。这样就是response都存下来了。

    注意:如果使用NSURLSession并且实现这个代理方法,你的代理方法必须掉调用completion handler,不然就回内存泄露。

    7-1是阻止on-desk caching HTTP response的例子,只把HTTPF response放到内存中去。并且把缓存的response的时间添加到user info字典中去了。

    -(NSCachedURLResponse *)connection:(NSURLConnection *)connection
                     willCacheResponse:(NSCachedURLResponse *)cachedResponse
    {
        NSCachedURLResponse *newCachedResponse = cachedResponse;
     
        NSDictionary *newUserInfo;
        newUserInfo = [NSDictionary dictionaryWithObject:[NSDate date]
                                                     forKey:@"Cached Date"];
        if ([[[[cachedResponse response] URL] scheme] isEqual:@"https"]) {
    #if ALLOW_IN_MEMORY_CACHING
            newCachedResponse = [[NSCachedURLResponse alloc]
                                    initWithResponse:[cachedResponse response]
                                        data:[cachedResponse data]
                                        userInfo:newUserInfo
                                        storagePolicy:NSURLCacheStorageAllowedInMemoryOnly];
    #else // !ALLOW_IN_MEMORY_CACHING
            newCachedResponse = nil
    #endif // ALLOW_IN_MEMORY_CACHING
        } else {
            newCachedResponse = [[NSCachedURLResponse alloc]
                                    initWithResponse:[cachedResponse response]
                                        data:[cachedResponse data]
                                        userInfo:newUserInfo
                                        storagePolicy:[cachedResponse storagePolicy]];
        }
        return newCachedResponse;
    }
    
  • 相关阅读:
    第一次离职了
    华为手机 关于Android真机调试的时候logcat中无法输出调试信息的解决办法
    ListView的简单实用
    博客生涯开始
    hdu1151:Air Raid(最小路径覆盖)
    hdu1151:Air Raid(最小路径覆盖)
    hdu1162:Eddy's picture(最小生成树)
    hdu1162:Eddy's picture(最小生成树)
    hdu1301:Jungle Roads(最小生成树)
    hdu1301:Jungle Roads(最小生成树)
  • 原文地址:https://www.cnblogs.com/sanjianghuiliu/p/6545843.html
Copyright © 2020-2023  润新知