• UIwebView实现html的离线缓存


    1、html的缓存主要採取ASIHTTPRequest的缓存策略
    (1)、设置缓存策略

        //设置缓存
        ASIDownloadCache *cache=[[ASIDownloadCache alloc] init];
        self.myCache=cache;
        //设置缓存路径
        NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
        NSString *documentDirectory = [paths objectAtIndex:0];
        //设置缓存存放路径
        [self.myCache setStoragePath:[documentDirectory stringByAppendingPathComponent:@"resource"]];
        //ASIAskServerIfModifiedCachePolicy 与默认缓存大致一样。差别仅是每次请求都会 去server推断是否有更新
        //ASIOnlyLoadIfNotCachedCachePolicy 假设有缓存在本地,无论其过期与否。总会拿来使用
        //ASIFallbackToCacheIfLoadFailsCachePolicy  这个选项常常被用来与其他选项组合使用。请求失败时,假设有缓存当网络则返回本地缓存信息
        [self.myCache setDefaultCachePolicy:ASIFallbackToCacheIfLoadFailsCachePolicy];      //设置缓存策略

    (2)、设置异步缓存

       NSURL *Requesturl=[NSURL URLWithString:url];
        ASIHTTPRequest *request=[ASIHTTPRequest requestWithURL:Requesturl];
        //    //获取全局变量
        AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
        //    //设置缓存方式
        [request setDownloadCache:appDelegate.myCache];
        //    //设置缓存数据存储策略。这里採取的是假设无更新或无法联网就读取缓存数据
        [request setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy];
        [request setDelegate:self];
         [request startAsynchronous];

    html缓存完毕。如想查看具体 请点击 : IOS开发网络篇之──ASIHTTPRequest具体解释

    2、html中的图片缓存
    (1)、通过正则获取html代码中的全部图片url

      NSString *urlPattern = @"<img[^>]+?

    src=["']?

    ([^>'"]+)["']?

    "; NSError *error = [NSError new]; NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:urlPattern options:NSRegularExpressionCaseInsensitive error:&error ]; //match 这块内容很强大 NSUInteger counts =[regex numberOfMatchesInString:content options:NSRegularExpressionCaseInsensitive range:NSMakeRange(0, [content length])];//匹配到的次数 if(counts > 0){ NSArray* matches = [regex matchesInString:content options:NSMatchingReportCompletion range:NSMakeRange(0, [content length])]; for (NSTextCheckingResult *match in matches) { NSInteger count = [match numberOfRanges];//匹配项 for(NSInteger index = 0;index < count;index++){ NSRange halfRange = [match rangeAtIndex:index]; if (index == 1) { //[listImage addObject:[content substringWithRange:halfRange]]; NSLog(@"转换出来的字符串===%@",[content substringWithRange:halfRange]); [listImage addObject:[content substringWithRange:halfRange]]; } } }//遍历后能够看到三个range。1、为总体。

    2、为([\w-]+\.)匹配到的内容。3、([\w.%&=-]*)匹配到的内容 }

    (2)、SDwebImage下载图片 、JS交互替换

     dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul);
        dispatch_group_t group = dispatch_group_create();
        for (int i = 0; i < listImage.count; i++)
        {
            NSString *imageUrl = [imageUrlArray objectAtIndex:i];
            NSString *key=[self getMd5_32Bit_String:imageUrl];
            UIImage *cachedImage=[[SDImageCache sharedImageCache] imageFromDiskCacheForKey:key];
            NSString *index = [NSString stringWithFormat:@"%d", i];
    
            if (cachedImage) {
    
                [tchWebView stringByEvaluatingJavaScriptFromString:[self createSetImageUrlJavaScript:index
                                                                                              imgUrl:key]];
            }else{
    
                dispatch_group_async(group, queue, ^{
                    //异步下载图片
                    [SDWebImageDownloader.sharedDownloader downloadImageWithURL:[NSURL URLWithString:imageUrl]
                                                                        options:0
                                                                       progress:^(NSInteger receivedSize, NSInteger expectedSize)
                     {
                         // progression tracking code
                     }
                                                                      completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished)
                     {
                         if (image && finished)
                         {
                             [[SDImageCache sharedImageCache] storeImage:image forKey:key];
                             dispatch_sync(dispatch_get_main_queue(), ^{
                                 [tchWebView stringByEvaluatingJavaScriptFromString:[self createSetImageUrlJavaScript:index
                                                                                                                   imgUrl:key]];
                             });
                         }
                     }];
    
                });
            }
        }
        dispatch_release(group);
    //设置下载完毕的图片到web img
    - (NSString *)createSetImageUrlJavaScript:(NSString *) index imgUrl:(NSString *) url{
        UIImage *myCachaImage=[[SDImageCache sharedImageCache] imageFromDiskCacheForKey:url];
        NSData *imageData = UIImageJPEGRepresentation(myCachaImage,1.0);
        NSString *imageSource = [NSString stringWithFormat:@"data:image/jpg;base64,%@",[imageData base64Encoding]];
    
        NSString *js = [NSString stringWithFormat:@"var imgArray = document.getElementsByTagName('img'); imgArray[%@].src="%@"; " , index, imageSource];
        return js;
    }
    //32位MD5加密方式
    - (NSString *)getMd5_32Bit_String:(NSString *)srcString{
        const char *cStr = [srcString UTF8String];
        unsigned char digest[CC_MD5_DIGEST_LENGTH];
        CC_MD5( cStr, strlen(cStr), digest );
        NSMutableString *result = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
        for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
            [result appendFormat:@"%02x", digest[i]];
    
        return result;
    }

    參考:http://bbs.csdn.net/topics/390831054

  • 相关阅读:
    黑马程序员JAVA基础Java 集合之Collections 工具类
    黑马程序员JAVA基础Java 集合之Set 接口
    黑马程序员JAVA基础Java 集合之List 集合
    通过回车来完成数据的提交
    BizTalk中多个子记录映射解决办法
    框架的展开与关闭
    一个有用的触发器
    SQL 中分隔字符串的获取
    未保存离开页面要给出提示
    常用的一些javascript小技巧 很实用
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5322772.html
Copyright © 2020-2023  润新知