你好OPPOr7 老罗陌陌直播视频不能视频 为什么

2007年4月 总版技术专家分月排行榜第一2007年3月 总版技术专家分月排行榜第一2007年2月 总版技术专家分月排行榜第一2007年1月 总版技术专家分月排行榜第一2006年12月 总版技术专家分月排行榜第一
2009年8月 总版技术专家分月排行榜第三2007年5月 总版技术专家分月排行榜第三
2007年4月 总版技术专家分月排行榜第一2007年3月 总版技术专家分月排行榜第一2007年2月 总版技术专家分月排行榜第一2007年1月 总版技术专家分月排行榜第一2006年12月 总版技术专家分月排行榜第一
2009年8月 总版技术专家分月排行榜第三2007年5月 总版技术专家分月排行榜第三
2007年4月 总版技术专家分月排行榜第一2007年3月 总版技术专家分月排行榜第一2007年2月 总版技术专家分月排行榜第一2007年1月 总版技术专家分月排行榜第一2006年12月 总版技术专家分月排行榜第一
2009年8月 总版技术专家分月排行榜第三2007年5月 总版技术专家分月排行榜第三
2007年4月 总版技术专家分月排行榜第一2007年3月 总版技术专家分月排行榜第一2007年2月 总版技术专家分月排行榜第一2007年1月 总版技术专家分月排行榜第一2006年12月 总版技术专家分月排行榜第一
2009年8月 总版技术专家分月排行榜第三2007年5月 总版技术专家分月排行榜第三
2007年4月 总版技术专家分月排行榜第一2007年3月 总版技术专家分月排行榜第一2007年2月 总版技术专家分月排行榜第一2007年1月 总版技术专家分月排行榜第一2006年12月 总版技术专家分月排行榜第一
2009年8月 总版技术专家分月排行榜第三2007年5月 总版技术专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。2667人阅读
先说说缓存机制:
无缓存情况下:
  对同一个URL请求多次,返回的数据可能都是一样的,比如服务器上的某张图片,无论下载多少次,返回的数据都是一样的。
  上面的情况会造成以下问题
(1)用户流量的浪费
(2)程序响应速度不够快
解决上面的问题,一般考虑对数据进行缓存。
  为了提高程序的响应速度,可以考虑使用缓存(内存缓存\硬盘缓存)
  第一次请求数据时,内存缓存中没有数据,硬盘缓存中没有数据。
缓存数据的过程
当服务器返回数据时,需要做以下步骤
(1)使用服务器的数据(比如解析、显示)
(2)将服务器的数据缓存到硬盘(沙盒)
此时缓存的情况是:内存缓存中有数据,硬盘缓存中有数据。
再次请求数据分为两种情况:
(1)如果程序并没有被关闭,一直在运行
  那么此时内存缓存中有数据,硬盘缓存中有数据。如果此时再次请求数据,直接使用内存缓存中的数据即可
(2)如果程序重新启动
  那么此时内存缓存已经消失,没有数据,硬盘缓存依旧存在,还有数据。如果此时再次请求数据,需要读取内存中缓存的数据。
提示:从硬盘缓存中读取数据后,内存缓存中又有数据了
缓存的实现:(系统自带的方法的实现缓存)
由于GET请求一般用来查询数据,POST请求一般是发大量数据给服务器处理(变动性比较大)
因此一般只对GET请求进行缓存,而不对POST请求进行缓存
  在iOS中,可以使用NSURLCache类缓存数据
  iOS 5之前:只支持内存缓存。从iOS 5开始:同时支持内存缓存和硬盘缓存
2.NSURLCache
iOS中得缓存技术用到了NSURLCache类。
缓存原理:一个NSURLRequest对应一个NSCachedURLResponse
缓存技术:把缓存的数据都保存到数据库中。
3.NSURLCache的常见用法
(1)获得全局缓存对象(没必要手动创建)NSURLCache *cache = [NSURLCache sharedURLCache];&
(2)设置内存缓存的最大容量(字节为单位,默认为512KB)- (void)setMemoryCapacity:(NSUInteger)memoryC
(3)设置硬盘缓存的最大容量(字节为单位,默认为10M)- (void)setDiskCapacity:(NSUInteger)diskC
(4)硬盘缓存的位置:沙盒/Library/Caches
(5)取得某个请求的缓存- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)&
(6)清除某个请求的缓存- (void)removeCachedResponseForRequest:(NSURLRequest *)
(7)清除所有的缓存- (void)removeAllCachedR
4.缓存GET请求
  要想对某个GET请求进行数据缓存,非常简单
  NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
  // 设置缓存策略
  request.cachePolicy = NSURLRequestReturnCacheDataElseL
  只要设置了缓存策略,系统会自动利用NSURLCache进行数据缓存
5.iOS对NSURLRequest提供了7种缓存策略:(实际上能用的只有4种)
NSURLRequestUseProtocolCachePolicy // 默认的缓存策略(取决于协议)
NSURLRequestReloadIgnoringLocalCacheData // 忽略缓存,重新请求
NSURLRequestReloadIgnoringLocalAndRemoteCacheData // 未实现
NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData // 忽略缓存,重新请求
NSURLRequestReturnCacheDataElseLoad// 有缓存就用缓存,没有缓存就重新请求
NSURLRequestReturnCacheDataDontLoad// 有缓存就用缓存,没有缓存就不发请求,当做请求出错处理(用于离线模式)
NSURLRequestReloadRevalidatingCacheData // 未实现
6.缓存的注意事项
缓存的设置需要根据具体的情况考虑,如果请求某个URL的返回数据:
  (1)经常更新:不能用缓存!比如股票、彩票数据
  (2)一成不变:果断用缓存
  (3)偶尔更新:可以定期更改缓存策略 或者 清除缓存
提示:如果大量使用缓存,会越积越大,建议定期清除缓存
四、简单的代码示例
1 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
// 1.创建请求
NSURL *url = [NSURL URLWithString:@&http://127.0.0.1:8080/YYServer/video&];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// 2.设置缓存策略(有缓存就用缓存,没有缓存就重新请求)
request.cachePolicy = NSURLRequestReturnCacheDataElseL
// 3.发送请求
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
if (data) {
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
NSLog(@&%@&, dict);
// 定期处理缓存
if (缓存没有达到7天) {
request.cachePolicy = NSURLRequestReturnCacheDataElseL
// 获得全局的缓存对象
NSURLCache *cache = [NSURLCache sharedURLCache];
if (缓存达到7天) {
[cache removeCachedResponseForRequest:request];
// lastCacheDate =
NSCachedURLResponse *response = [cache cachedResponseForRequest:request];
if (response) {
NSLog(@&---这个请求已经存在缓存&);
NSLog(@&---这个请求没有缓存&);
对于ios开发用到比较多的就是图片的缓存,一般会用SDWedImage来实现图片的下载和缓存;
下面我简单说说SDWebImage这个第三方图片加载软件
第一步,下载SDWebImage,导入工程。github托管地址
第二步,在需要的地方导入头文件
#import&&UIImageView+WebCache.h&
第三步,调用sd_setImageWithURL:方法缓存图片,注意,这就是新版本的新方法,旧方法是setImageWithURL:。下面将几个方法都介绍一下。
1. sd_setImageWithURL:
//图片缓存的基本代码,就是这么简单
&&&&[self.image1&sd_setImageWithURL:imagePath1];
2. sd_setImageWithURL:& completed:
//用block&可以在图片加载完成之后做些事情
&&&&[self.image2&sd_setImageWithURL:imagePath2&completed:^(UIImage&*image,&NSError&*error,&SDImageCacheType&cacheType,&NSURL&*imageURL)&{
&&&&&&&&NSLog(@&这里可以在图片加载完成之后做些事情&);
3. sd_setImageWithURL:& placeholderImage:
//给一张默认图片,先使用默认图片,当图片加载完成后再替换
&&&&[self.image1&sd_setImageWithURL:imagePath1&placeholderImage:[UIImage&imageNamed:@&default&]];
4. sd_setImageWithURL:& placeholderImage:& completed:
//使用默认图片,而且用block&在完成后做一些事情
&&&&[self.image1&sd_setImageWithURL:imagePath1&placeholderImage:[UIImage&imageNamed:@&default&]&completed:^(UIImage&*image,&NSError&*error,&SDImageCacheType&cacheType,&NSURL&*imageURL)&{
&&&&&&&&NSLog(@&图片加载完成后做的事情&);
5. sd_setImageWithURL:& placeholderImage:& options:
//options&选择方式
&&&&[self.image1&sd_setImageWithURL:imagePath1&placeholderImage:[UIImage&imageNamed:@&default&]&options:SDWebImageRetryFailed];
其他就不一一介绍了,oc是自文档语言,看方法名就知道干什么的了。除了带options选项的方法,其他的方法都是综合存储,也就是内存缓存和磁盘缓存结合的方式,如果你只需要内存缓存,那么在options这里选择SDWebImageCacheMemoryOnly就可以了。
如果不想深入了解,到这里你已经可以用SDWebimage进行图片缓存了,接下来我要解释options的所有选项,以及SDWebImage内部执行流程。
一、options所有选项:
  //失败后重试
&&&&&SDWebImageRetryFailed&=&1&&&&0,
&&&&&//UI交互期间开始下载,导致延迟下载比如UIScrollView减速。
&&&&&SDWebImageLowPriority&=&1&&&&1,
&&&&&//只进行内存缓存
&&&&&SDWebImageCacheMemoryOnly&=&1&&&&2,
&&&&&//这个标志可以渐进式下载,显示的图像是逐步在下载
&&&&&SDWebImageProgressiveDownload&=&1&&&&3,
&&&&&//刷新缓存
&&&&&SDWebImageRefreshCached&=&1&&&&4,
&&&&&//后台下载
&&&&&SDWebImageContinueInBackground&=&1&&&&5,
&&&&&//NSMutableURLRequest.HTTPShouldHandleCookies&=&YES;
&&&&&SDWebImageHandleCookies&=&1&&&&6,
&&&&&//允许使用无效的SSL证书
&&&&&//SDWebImageAllowInvalidSSLCertificates&=&1&&&&7,
&&&&&//优先下载
&&&&&SDWebImageHighPriority&=&1&&&&8,
&&&&&//延迟占位符
&&&&&SDWebImageDelayPlaceholder&=&1&&&&9,
&&&&&//改变动画形象
&&&&&SDWebImageTransformAnimatedImage&=&1&&&&10,
二、SDWebImage内部实现过程
入口 setImageWithURL:placeholderImage:options: 会先把 placeholderImage 显示,然后 SDWebImageManager 根据 URL 开始处理图片。
进入 SDWebImageManager-downloadWithURL:delegate:options:userInfo:,交给 SDImageCache 从缓存查找图片是否已经下载 queryDiskCacheForKey:delegate:userInfo:.
先从内存图片缓存查找是否有图片,如果内存中已经有图片缓存,SDImageCacheDelegate 回调 imageCache:didFindImage:forKey:userInfo: 到 SDWebImageManager。
SDWebImageManagerDelegate 回调 webImageManager:didFinishWithImage: 到 UIImageView+WebCache 等前端展示图片。
如果内存缓存中没有,生成 NSInvocationOperation 添加到队列开始从硬盘查找图片是否已经缓存。
根据 URLKey 在硬盘缓存目录下尝试读取图片文件。这一步是在 NSOperation 进行的操作,所以回主线程进行结果回调 notifyDelegate:。
如果上一操作从硬盘读取到了图片,将图片添加到内存缓存中(如果空闲内存过小,会先清空内存缓存)。SDImageCacheDelegate 回调 imageCache:didFindImage:forKey:userInfo:。进而回调展示图片。
如果从硬盘缓存目录读取不到图片,说明所有缓存都不存在该图片,需要下载图片,回调 imageCache:didNotFindImageForKey:userInfo:。
共享或重新生成一个下载器 SDWebImageDownloader 开始下载图片。
图片下载由 NSURLConnection 来做,实现相关 delegate 来判断图片下载中、下载完成和下载失败。
connection:didReceiveData: 中利用 ImageIO 做了按图片下载进度加载效果。
connectionDidFinishLoading: 数据下载完成后交给 SDWebImageDecoder 做图片解码处理。
图片解码处理在一个 NSOperationQueue 完成,不会拖慢主线程 UI。如果有需要对下载的图片进行二次处理,最好也在这里完成,效率会好很多。
在主线程 notifyDelegateOnMainThreadWithInfo: 宣告解码完成,imageDecoder:didFinishDecodingImage:userInfo: 回调给 SDWebImageDownloader。
imageDownloader:didFinishWithImage: 回调给 SDWebImageManager 告知图片下载完成。
通知所有的 downloadDelegates 下载完成,回调给需要的地方展示图片。
将图片保存到 SDImageCache 中,内存缓存和硬盘缓存同时保存。写文件到硬盘也在以单独 NSInvocationOperation 完成,避免拖慢主线程。
SDImageCache 在初始化的时候会注册一些消息通知,在内存警告或退到后台的时候清理内存图片缓存,应用结束的时候清理过期图片。
SDWI 也提供了 UIButton+WebCache 和 MKAnnotationView+WebCache,方便使用。
SDWebImagePrefetcher 可以预先下载图片,方便后续使用。
从上面流程可以看出,当你调用setImageWithURL:方法的时候,他会自动去给你干这么多事,当你需要在某一具体时刻做事情的时候,你可以覆盖这些方法。比如在下载某个图片的过程中要响应一个事件,就覆盖这个方法:
//覆盖方法,指哪打哪,这个方法是下载imagePath2的时候响应
&&&&SDWebImageManager&*manager&=&[SDWebImageManager&sharedManager];
&&&&[manager&downloadImageWithURL:imagePath2&options:SDWebImageRetryFailed&progress:^(NSInteger&receivedSize,&NSInteger&expectedSize)&{
&&&&&&&&NSLog(@&显示当前进度&);
&&&&}&completed:^(UIImage&*image,&NSError&*error,&SDImageCacheType&cacheType,&BOOL&finished,&NSURL&*imageURL)&{
&&&&&&&&NSLog(@&下载完成&);
对于初级来说,用sd_setImageWithURL:的若干个方法就可以实现很好的图片缓存。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2694次
排名:千里之外QQ聊天中图片一直显示在缓冲显示不出来解决办法
QQ聊天中图片一直显示在缓冲显示不出来解决办法。很多人都会遇到在聊天中别人发来图片,在自己的电脑上一直显示在缓冲中,打不开。可看到别人却都可以打开看到。这个为什么呢?下文就让小编跟大家讲讲怎么解决QQ聊天中图片一直显示在缓冲显示不出来问题。QQ聊天中图片一直显示在缓冲显示不出来解决办法:小编自己发现:当你聊天界面中图片一直显示转圈圈。打开聊天历史记录,就可以看到。因为记录已经缓存保存好图片。这样就可以觉得图片一直显示缓冲中的问题。
如果本文对您有帮助请分享给您的好友,也可按Ctrl+D收藏本页面,谢谢!
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
傻逼东西草泥马的
请问QQ群里的图片一直显示缓冲见不到图片,QQ群聊天记录里面也看不到图片,请问这是怎么回事呀,应该怎么解决才好

我要回帖

更多关于 罗永浩陌陌直播视频 的文章

 

随机推荐