技术标签: 个人
1 设置imageView的图片 (内存缓存&磁盘缓存)
1 [cell.imageView sd_setImageWithURL:[NSURL URLWithString:app.icon] placeholderImage:[UIImage imageNamed:@"placehoder"]];
2 设置图片另外几种方法
1 /*
2 第一个参数:要下载图片的url地址
3 第二个参数:设置该imageView的占位图片
4 第三个参数:传一个枚举值,告诉程序你下载图片的策略是什么
5 第一个block块:获取当前图片数据的下载进度
6 receivedSize:已经下载完成的数据大小
7 expectedSize:该文件的数据总大小
8 第二个block块:当图片下载完成之后执行该block中的代码
9 image:下载得到的图片数据
10 error:下载出现的错误信息
11 SDImageCacheType:图片的缓存策略(不缓存,内存缓存,沙盒缓存)
12 imageURL:下载的图片的url地址
13 */
14 [self.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://img5.duitang.com/uploads/item/201409/02/20140902150244_nMMEj.jpeg"] placeholderImage:[UIImage imageNamed:@"Snip20160111_304"] options:(kNilOptions) progress:^(NSInteger receivedSize, NSInteger expectedSize) {
15 NSLog(@"%f",1.0 * receivedSize/expectedSize);
16 } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
17 switch (cacheType) {
18 case SDImageCacheTypeNone:
19 NSLog(@"没有使用缓存,图片是直接下载的");
20 break;
21 case SDImageCacheTypeDisk:
22 NSLog(@"磁盘缓存");
23 break;
24 case SDImageCacheTypeMemory:
25 NSLog(@"内存缓存");
26 break;
27 default:
28 break;
29 }
30 }];
1 //如果不需要占位图片,可以用如下代码 2 [[SDWebImageManager sharedManager] downloadImageWithURL:[NSURL URLWithString:@"http://img5.duitang.com/uploads/item/201409/02/20140902150244_nMMEj.jpeg"] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) { 3 NSLog(@"%f",1.0 * receivedSize/expectedSize); 4 } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { 5 self.imageView.image = image; 6 switch (cacheType) { 7 case SDImageCacheTypeNone: 8 NSLog(@"没有使用缓存,图片是直接下载的"); 9 break; 10 case SDImageCacheTypeDisk: 11 NSLog(@"磁盘缓存"); 12 break; 13 case SDImageCacheTypeMemory: 14 NSLog(@"内存缓存"); 15 break; 16 default: 17 break; 18 } 19 }];
1 //注意点:completed回调是在子线程处理的 2 //内部并不会做缓存处理 3 4 [[SDWebImageDownloader sharedDownloader] downloadImageWithURL:[NSURL URLWithString:@"http://img.qqbody.com/uploads/allimg/201503/20150331222879.gif"] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) { 5 NSLog(@"%f",1.0 * receivedSize/expectedSize); 6 7 } completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) { 8 9 //线程间通信 10 [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 11 self.imageView.image = [UIImage sd_animatedGIFWithData:data]; 12 }]; 13 }];
3 系统级的内存警告如何处理
1 //取消当前正在进行的所有下载操作
2 [[SDWebImageManager sharedManager] cancelAll];
3
4 //清除缓存数据
5 //cleanDisk:删除过期的文件数据,计算当前未过期的已经下载的文件数据的大小,如果发现该数据大小大于我们设置的最大缓存数据大小,那么程序内部会按照按文件数据缓存的时间从远到近删除,知道小于最大缓存数据为止。
6 [[SDWebImageManager sharedManager].imageCache cleanDisk];
7
8 //clearMemory:直接删除文件,重新创建新的文件夹
9 [[SDWebImageManager sharedManager].imageCache clearMemory];
1 + (UIImage *)sd_animatedGIFNamed:(NSString *)name
2 + (UIImage *)sd_animatedGIFWithData:(NSData *)data
b.内部实现
1 /*
2 5-1 把用户传入的gif图片->NSData
3 5-2 根据该Data创建一个图片数据源(NSData->CFImageSourceRef)
4 5-3 计算该数据源中一共有多少帧,把每一帧数据取出来放到图片数组中
5 5-4 根据得到的数组+计算的动画时间 == 可动画的image
6 [UIImage animatedImageWithImages:images duration:duration];
7 */
8 //如果图片帧数小于等于1,那么就直接把二进制数据转换为图片,并返回图片
9 if (count <= 1) {
10 animatedImage = [[UIImage alloc] initWithData:data];
11 }else {
12 //创建可变的空的图片数组
13 NSMutableArray *images = [NSMutableArray array];
14 //初始化动画播放时间为0
15 NSTimeInterval duration = 0.0f;
16 // 遍历并且提取所有的动画帧
17 for (size_t i = 0; i < count; i++) {
18 CGImageRef image = CGImageSourceCreateImageAtIndex(source, i, NULL);
19 // 累加动画时长
20 duration += [self sd_frameDurationAtIndex:i source:source];
21 // 将图像添加到动画数组
22 [images addObject:[UIImage imageWithCGImage:image scale:[UIScreen mainScreen].scale orientation:UIImageOrientationUp]];
23 //释放操作
24 CGImageRelease(image);
25 }
26 //计算动画时间
27 if (!duration) {
28 duration = (1.0f / 10.0f) * count;
29 }
30 // 建立可动画图像
31 animatedImage = [UIImage animatedImageWithImages:images duration:duration];
32 }
6 如何判断当前图片类型,只判断图片二进制数据的第一个字节
+ (NSString *)sd_contentTypeForImageData:(NSData *)data;
- (void)setObject:(ObjectType)obj forKey:(KeyType)key;//在缓存中设置指定键名对应的值,0成本
- (void)setObject:(ObjectType)obj forKey:(KeyType)key cost:(NSUInteger)g;//在缓存中设置指定键名对应的值,并且指定该键值对的成本,用于计算记录在缓存中的所有对象的总成本,出现内存警告或者超出缓存总成本上限的时候,缓存会开启一个回收过程,删除部分元素
- (void)removeObjectForKey:(KeyType)key;//删除缓存中指定键名的对象
- (void)removeAllObjects;//删除缓存中所有的对象
BTool是一个用于蓝牙设备调试的PC软件工具,工作在Central/Master 。它可以让用户通过PC软件同Peripheral/Slave BLE设备之间建立连接。在测试蓝牙模块的直驱功能时,使用BTool可以快速开发模块的功能,缩短研发周期。市面上主流的BTool软件有几款,CC2540 BTool和nRF Connect for Desktop较为常用,两者的BTool直驱测试体验如何,...
http://www.wufangbo.com/demo/css/15/index.html转载于:https://www.cnblogs.com/zhp404/articles/4233804.html
React 是一个专注于视图层的库。React 维护了状态到视图的映射关系,开发者只需关心状态即可,由 React 来操控视图。在小型应用中,单独使用 React 是没什么问题的。但在复杂应用中,容易碰到一些状态管理方面的问题,如:React 只提供了在内部组件修改状态的接口 setState。导致数据、业务逻辑和视图层耦合在组件内...
使用appium连接模拟器 实现安全锁里边的绘图使手机自动化进入到安全锁绘图里边配置 写死的from appium import webdriverfrom appium.webdriver.common.touch_action import TouchActionfrom time import sleep# 设置手机参数desired_caps = {}desired_caps['platformName'] = 'Android'desired_caps['platfor
近期为准备找工作面试,在网络上搜集了这些题,以备面试之用。插一条广告:本人求职,2016级应届毕业生,有开发经验。可独立开发,低薪求职。QQ:8951935431.简述OC中内存管理机制.答:内存管理机制:使用引用计数管理,分为ARC和MRC,MRC需要程序员自己管理内存,ARC则不需要.但是并不是 所有对象在ARC环境下均不需要管理内存,子线程和循环引用并不是这样.与retain配对使用...
之前几篇博客介绍了IPv6的扩展头部,包括分片头部和路由头部。接下来介绍一下IPv6扩展头部以及扩展选项的内容,可能会有这样的疑问,有了扩展头部怎么还需要扩展选项?扩展选项是干嘛用的?本篇博客就介绍相关内容。IPv6扩展头部 在IPv6中,那些由IPv4选项提供的特殊功能,通过在IPv6头部之后增加扩展头部实现。IPv4路由和时间戳功能都采用这种方式,其它功能(例如分片和...
linux启动weblogic出错:starting weblogic with Java version:Unrecognized option: -jrockitError: Could not create the Java Virtual Machine.Error: A fatal exception has occurred. Program will exit.
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------一、set方法的内存管理接着上篇博文的例子,为Person增加一个属性_age和它的get、set方法。在main.m中声明一新书。如果我们想给Person换一本新书。按照我们的思路,代码是这样的 #import #import by Mac
2021年数据显示,数字化转型能够使制造业企业营收增加22.6%,物流服务业企业营收增加33.6%,零售业企业营收增加33.3%。数字化转型能够使制造企业成本降低17.6%,物流服务业成本降低34.2%,零售业成本降低7.8%。企业通过数字化转型,建立一体化数字化平台底座,建设数据运营体系,强化内外数据的采集、融合、分析、应用、治理能力建设,实现数据在应用系统、软硬件设备、生产设备以及人员之间的实时、自由、有序流动,达成“数据-信息-知识-智慧”的价值跃迁。...
在各种跨平台开发中,源码级跨平台开发其实是最适中的。这种方式兼顾了灵活性和跨平台。显然,效率也会是最好的。但是,调试起来会比较的不容易。尤其重要的是开发难度比较高。所以,很多人宁愿选择效率有损失的二进制级别跨平台。但是,很多时候程序的运行效率还是放在第一位的。此时,我们就不得不采用源码级跨平台开发。比如游戏引擎、强数据运算的算法、传输算法等等。 源码级跨平台开发的
create or replace procedure BACKUP_INVENTORY as type balance is ref cursor; balanceDaylly balance;INV_ID NUMBER(19);LOCATION_ID NUMBER(19);ITEM_KEY_ID VARCHAR2(50);PACKAGE_UNIT_ID VARCHAR2(...
2021.03.15文章目录【课程导读】【英文原文】【外刊原文】【课程导读】只要有唐人街的地方,就一定会有茶餐厅。精致好味的广式料理在海外,已然成了中餐的代名词。然而,一场疫情令全球餐饮业都风雨飘摇,很多海外茶餐厅也受到了影响。近日,《纽约时报》资深记者深入位于当地唐人街的“金丰大酒楼”,为我们解读了一家茶餐厅令人无限唏嘘的落寞终场。在海外,茶餐厅与其他餐馆的核心区别是什么?在疫情中,它们面临的最大挑战是什么?【英文原文】Closing of Beloved Dim Sum Hall Leaves