关于学习是UIWebView的一些思考

前几天由于数据中加载有html语言的数据,关于html语言和UIWebView,有一些纠结,通过几天的研究,也有了一些本身的简单的看法。
 
       我有两个页面须要加载html语言(注意,这里面的html不是从json解析出来的一段html语言,而是整个网站,而后用谷歌的开发者工具可接看到网站的源码),这段html语言显示的内容包括排版仍是比较好的,因此我想直接把这个网站加载到个人程序上,可是因为是别的的数据,概览上面有一段我不想要的数据,滚动视图的详情页面有我不少不想要的数据,因此我就想到了把这段不想要的代码给删除掉。因此我想到了两个办法(网页的源码咱们是没法直接的删除的),第一个,我利用UIWebView的js交互的方法,用dom语言把这一段给隐藏掉(例如: [self.webView stringByEvaluatingJavaScriptFromString:@"document.getElementsByClassName(\"m-app-download\")[0].hidden = true;"];),这段代码只有在UIWebView请求结束的时候使用才比较好,因此在加载的时候会先出现你不想要的那一部分,而后请求加载完成了以后(用的loadrequest请求)才会隐藏掉,因此仍是达不到预期的效果;第二个办法,把整个后台的数据转换成字符串,而后删除或者修改我不想要的那一部分(例如:1. NSString * dataString = [NSString stringWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@",webUrl]] encoding:NSUTF8StringEncoding error:nil]; 2. dataString = [dataString stringByReplacingOccurrencesOfString:@"\"m-app-download\"" withString:@" ]; 3. [self.webView loadHTMLString:dataString baseURL:nil];),通过这三部,也能达到预期的效果,可是会存在一个问题,有点卡,暂时先不处理这,最起码达到了要求。
 
        而后我满怀欣喜的去处理滚动视图上的连接,这个地方要比概览的网站大的多,加载的东西也很是多,我就利用第二种方法去处理它,由于我第二种方法是处理字符串,当我看到这个地方的字符串的时候,由于有很是多得类似的地方,字符串很难去处理,又一次陷入了纠结,因此我想到一个比较懒的方法,我如今视觉上让上面的我不想要的隐藏(由于这段字符串处理起来比较的简单),而后下面的我等请求结束后,在用dom给隐藏掉不就好了,而后继续作,后来成功了。
 
 
而后我觉得是大功告成了,但是在测试的时候,我进入滚动页面详情的时候,很是极其的卡,后来就思考这是为何,而后想到了一个缘由,是否是UIWebView的加载的网站过大,再加上UIWebView的内存不能释放所形成的,而后我开始想这个解决办法,那不用UIWebView不就好了,而后我就想到了之前看到的一个第三方类(TFHpple)用来过滤html的标签,来获取本身想要的那一部分,因此就开始研究TFHpple,后来才知道过滤标签须要用到XPath语言(一种过滤xml和html的语言)(关于XPath的一些知识 http://www.ruanyifeng.com/blog/2009/07/xpath_path_expressions.html),后来通过一段时间的学习很快的掌握了这一个知识点(例:使用过程:1.导入 #import  “TFHpple.h"  #import  “TFHppleElement.h"  #import  “XPathQuery.h” 2.添加一个库,这个库是:libxml2.2.dylib。而且还须要设置一些路径参数,不然会一直报错;这个路径的设置,在 targets中,在build settings搜索Header Search Paths,将debug和release设置不一样的值;  debug的值设置成:/usr/include/libxml2    release的值设置成:${SDKROOT}/usr/include/libxml2     3. 将html语言转换成data, NSString *dataString = [NSString stringWithContentsOfURL:[NSURL URLWithString:@" http://breadtrip.com/mobile/destination/topic/2387718792/"] encoding:NSUTF8StringEncoding error:nil];
NSData *htmlData = [dataString dataUsingEncoding:NSUTF8StringEncoding];  4.书写XPath过滤语句: NSString *nodeString = @"//section//dl";
    NSString *nodeString = @"//p[@class=\"double-line\"]";
    NSString * nodeString = @"//dd[a[@class=\"pic\"]]//img"; //全部的图片
    NSString * nodeString = @"//div[@class=\"info\"]//p[@class=\"summary\"][1]"; //得到全部的文字,15段文字
    NSString * nodeString = @"//dd[div[@class=\"info\"]]//a[@class=\"pic\"]//img";
    NSString * nodeString = @"//header//img ;等等 
5.得到想要的那个对象: TFHpple *xpathParser = [[TFHpple alloc] initWithHTMLData:htmlData];
NSArray *elements  = [xpathParser searchWithXPathQuery:nodeString];(注意数组里面装得是 TFHppleElement对象,  这样能够打印出来NSString * string = ele.attributes[@"src ];    NSLog(@"%@",string);))而后接卸终于结束了,得到数据进行简单的布局,这样布局的时候就不会有UIWebView那么好看的界面了,很惋惜。 
 
        后来开始加载页面,原本觉得问题已经解决掉了,但是仍是很是的卡,这是为何呢,接着就思考缘由而后检查个人代码,这些方法都有( NSString * dataString = [NSString stringWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@",webUrl]] encoding:NSUTF8StringEncoding error:nil];)这段代码,测试后这段代码的耗时是很是长的,并且这段代码是在主线程来加载的因此,会很是的卡,终于找到了缘由,因此就果断的用GCD开辟一条线程去加载数据
 
建立一个串行异步线程(串行异步能保证效率,又能控制它在异步线程上的执行顺序,因此用这个),而后回到主线程更新UI界面(self.hud是加载时候的蒙版),不出所料,果真很是的快了,各类快。后来想既然这样那么UIWebView应该也没有问题,因此上面的代码改为了UIWebView去loadHTMLString,发现依旧很是的快,并且界面的问题也保证了,果断欣喜。后来我有进行了疯狂的点击测试,发现没有问题,并且很快,可是就在点击了100屡次左右,系统打印了内存警告的提示,后来一想,这是对的,由于UIWebView建立后的内存不可以释放,就算你退出了也不能释放,因此这个地方,当不少次的建立就可能致使内存警告(离着闪退还有一段距离),因此这个地方还得用TFHpple解析(很搓的界面是wufa避免了,我仍是偷懒先用着UIWebVIew吧)。
       总结:问题须要多方面的qu考虑,当遇到卡顿的时候,应该首先想到的就是线程的问题,在知足了功能的要求以后,应该还要站在用户的角度上去思考问题,好比内存问题,体验问题等等,这个地方走了不少的弯路,可是也学到了不少的知识,因此说是值得的。慢慢的积跬步而后去致千里。
 
以上内容纯属本身的看法,但愿有错误你们一块儿改正。。。
相关文章
相关标签/搜索