1.将接口返回的图片缓存到本地,由于写data到本地是耗时操作,为了不阻塞主线程,可开启子线程来做此操作

 dispatch_queue_t queue = dispatch_queue_create("cn.xxx.queue", DISPATCH_QUEUE_SERIAL);
// 异步存到沙盒
dispatch_async(queue, ^{ for (XWMainBtnSkinModel *skinM in self.models) { // btn_Bottom_4
NSString *path = [skinM.btnKey cacheDirWithSubpath:@"tabbar"]; // 下载图片
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:skinM.img]]; [data writeToFile:path atomically:YES]; if([skinM.type isEqualToString:@""]){ // btn_Bottom_4_sel
NSString *selImgKey = [NSString stringWithFormat:@"%@_sel",skinM.btnKey];
NSString *selpath = [selImgKey cacheDirWithSubpath:@"tabbar"]; // 下载图片
NSData *selImgData = [NSData dataWithContentsOfURL:[NSURL URLWithString:skinM.selImg]]; [selImgData writeToFile:selpath atomically:YES];
}
} });

2.将请求到的图片,保存到内存,并给UI控件赋值,此处以tabbar为例

    UIImage *img = [[UIImage alloc] init];
UIImage *selImg = [[UIImage alloc] init];
int i = ;
for (UITabBarItem *item in self.tabBar.items) {
if(isNet){// 如果是从网络上获取,要告诉系统是@2x的图片
img = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:imgs[i]]] scale:2.0];
selImg = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:selImgs[i]]] scale:2.0];
}else{
img = [UIImage imageNamed:imgs[i]];
selImg = [UIImage imageNamed:selImgs[i]];
} item.image = [img imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; item.selectedImage = [selImg imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
i++;
}

3.第二次打开app时,判断本地是否有缓存文件,如果有,就取之前缓存中的文件(这样用户体验更好,省去去网络上下载图片)

    if (!isExist) { // 如果cache/tabbar这个目录不存在,就用默认主题
[self setUpChildController:mainPage title:@"首页" image:@"img_btn_mainpage_normal.png" selectedImage:@"img_btn_mainpage_select.png"]; [self setUpChildController:departClass title:@"分类" image:@"img_btn_class_normal" selectedImage:@"img_btn_class_select"]; [self setUpChildController:theme title:@"" image:@"img_btn_theme" selectedImage:@"img_btn_theme"]; [self setUpChildController:message title:@"消息" image:@"img_btn_message_normal" selectedImage:@"img_btn_message_select"]; [self setUpChildController:me title:@"我" image:@"img_btn_me_normal" selectedImage:@"img_btn_me_select"]; self.selectedIndex = ; // 矫正TabBar图片位置,使之垂直居中显示
CGFloat offset = 3.0;
for (UITabBarItem *item in self.tabBar.items) {
item.imageInsets = UIEdgeInsetsMake(offset, , -offset, );
if([item.title isEqualToString:@""])
{
item.imageInsets = UIEdgeInsetsMake(, , -, );
}
}
} else { //存在 [self setUpNetDataChildController:mainPage title:@"首页" image:@"btn_Bottom_1" selectedImage:@"btn_Bottom_1_sel"];
[self setUpNetDataChildController:departClass title:@"分类" image:@"btn_Bottom_2" selectedImage:@"btn_Bottom_2_sel"];
[self setUpNetDataChildController:theme title:@"" image:@"btn_Bottom_3" selectedImage:@"btn_Bottom_3_sel"];
[self setUpNetDataChildController:message title:@"消息" image:@"btn_Bottom_4" selectedImage:@"btn_Bottom_4_sel"];
[self setUpNetDataChildController:me title:@"我" image:@"btn_Bottom_5" selectedImage:@"btn_Bottom_5_sel"]; self.selectedIndex = ; // 矫正TabBar图片位置,使之垂直居中显示
CGFloat offset = 3.0;
for (UITabBarItem *item in self.tabBar.items) {
item.imageInsets = UIEdgeInsetsMake(offset, , -offset, );
if([item.title isEqualToString:@""])
{
item.imageInsets = UIEdgeInsetsMake(, , -, );
}
} }

4.如果到了主题的过期时间,就应该切换回默认的主题:从接口中获取到主题到期时间,并设置定时器,当到期后,就删除本地缓存,并不在处理接口返回的图片数据。(直到接口中的到期时间重设,才处理接口中的图片)

    [[NetRequest request]dataRequest:nil apiURL:__getSkinBtnImg needToCache:nil completeBlock:^(id result) {

        self.models = [XWMainBtnSkinModel mj_objectArrayWithKeyValuesArray:result[@"btnImg"]];
if(self.models.count > ){ XWMainBtnSkinModel *model = self.models[];
NSDateFormatter *date=[[NSDateFormatter alloc] init];
// endTime: "2016-04-16 16:45:59"
[date setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; /**服务返回的主题到期时间*/
NSDate *d=[date dateFromString:model.endTime];
NSTimeInterval late = [d timeIntervalSince1970]; NSDate *now = [NSDate date];
NSTimeInterval nowtiem = [now timeIntervalSince1970];
NSTimeInterval cha = late - nowtiem;
/**到期时间和当前时间的差值*/
self.cha = cha;
// 定时器(到期了就切回之前的默认主题)
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:cha target:self selector:@selector(returnSkan) userInfo:nil repeats:NO];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];; if(self.cha <=){ // 时间过了就不处理接口返回的数据了
return ;
} if (!isExist) {//目录不存在(第一次从网络上直接获取图片)
// 通知更改主题
[[NSNotificationCenter defaultCenter] postNotificationName:@"change" object:self userInfo:@{@"info":self.models}]; // 将图片 写入本地缓存起来,第二次就不用从网络上获取
[self writeFileToCache]; NSMutableArray *imgs = [NSMutableArray array];
NSMutableArray *selImgs = [NSMutableArray array]; for (XWMainBtnSkinModel *model in self.models) {
if ([model.type isEqualToString:@""]) {
[imgs addObject:model.img];
[selImgs addObject:model.selImg];
}
}
[self setUpTabbarWithImgs:imgs selImgs:selImgs isNet:YES];
[self.view setNeedsLayout];
} }else { // 如果没有请求到数据,就删除网络数据
[self returnSkan];
} } failedBlock:^(id error) {
[SVProgressHUD showErrorWithStatus:error];
}];
// 到时间后,就换回之前的皮肤
- (void)returnSkan
{
if ([[NSFileManager defaultManager] fileExistsAtPath:self.fileCache]) { // 删除沙盒的数据
[[NSFileManager defaultManager] removeItemAtPath:self.fileCache error:NULL];
}
// 该切回之前的主题了
[[NSNotificationCenter defaultCenter] postNotificationName:@"cha" object:self userInfo:nil]; NSMutableArray *normalImgs = [NSMutableArray arrayWithArray:@[@"img_btn_mainpage_normal.png",@"img_btn_class_normal",@"img_btn_theme",@"img_btn_message_normal",@"img_btn_me_normal"]];
NSMutableArray *selImgs = [NSMutableArray arrayWithArray:@[@"img_btn_mainpage_select.png",@"img_btn_class_select",@"img_btn_theme",@"img_btn_message_select",@"img_btn_me_select"]]; [self setUpTabbarWithImgs:normalImgs selImgs:selImgs isNet:NO];
}

定时改变App主题的方案的更多相关文章

  1. 基于 Flutter 以两种方式实现App主题切换

    概述 App主题切换已经成为了一种流行的用户体验,丰富了应用整体UI视觉效果.例如,白天夜间模式切换.实现该功能的思想其实不难,就是将涉及主题的资源文件进行全局替换更新.说到这里,我想你肯定能联想到一 ...

  2. iOS论App推送方案

    1.APNS介绍(原生推送实现原理) 在iOS平台上,大部分应用是不允许在后台运行并连接网络的.在应用没有被运行的时候,只能通过 Apple Push Notification Service (AP ...

  3. 车载导航应用中基于Sketch UI主题定制方案的实现

    1.导读 关于应用的主题定制,相信大家或多或少都有接触,基本上,实现思路可以分为两类: 内置主题(应用内自定义style) 外部加载方式(资源apk形式.压缩资源.插件等) 其实,针对不同的主题定制实 ...

  4. 移动端调试 — Pure|微信环境调试方案|App环境调试方案

    Pure 详细参见: 中文文档:http://leeluolee.github.io/2014/10/24/use-puer-helpus-developer-frontend/ 源码:https:/ ...

  5. PHP 开发 APP 接口 学习笔记与总结 - APP 接口实例 [4] 首页 APP 接口开发方案 ③ 定时读取缓存方式

    用于 linux 执行 crontab 命令生成缓存的文件 crop.php <?php //让crontab 定时执行的脚本程序 require_once 'db.php'; require_ ...

  6. Android主题切换方案总结

    所谓的主题切换,就是能够根据不同的设定,呈现不同风格的界面给用户,也就是所谓的换肤. 1.将主题包(图片与配置)存到SD卡上(可通过下载或手动放入指定目录),在代码里强制从本地文件创建图片与配置文字大 ...

  7. iOS开发之App主题切换完整解决方案(Swift版)

    本篇博客就来介绍一下iOS App中主题切换的常规做法,当然本篇博客中只是提到了一种主题切换的方法,当然还有其他方法,在此就不做过多赘述了.本篇博客中所涉及的Demo完全使用Swift3.0编写完成, ...

  8. vue+less换肤,主题切换方案

    新的项目对于客户自定义要求很高,然后换肤是其中一个很小的模块,经过了一段时间的摸索,看了许多文章,找到了几种方案. https://www.cnblogs.com/leiting/p/11203383 ...

  9. 改变linux默认配色方案(dircolors和dircolors-solarized使用)

    前言 前几天刚买了阿里云的云服务器,今天使用putty进入服务器,发现linux默认的bash配色实在太丑. 特别是文件夹显示为深蓝色,到了白天,和黑色背景一搭配,根本看不清文字. 好在在github ...

随机推荐

  1. Objective-C 笔记一(HelloWorld)

    作为一个果粉And程序员,奔着对OC浓厚的兴趣,开始学习IOS.并以后也想从事IOS开发工作.并将自己的学习记录下来,俗话说的好,不会总结的程序猿,不是好程序员! Xcode可以在AppStore里下 ...

  2. UITableView实现分组, 并且点击每个分组后展开

    效果图: 简单说下实现思路: 数据传过来之后, 先创建好对应个数的分组头部View, 也就是要在 - (UIView *)tableView:(UITableView *)tableView view ...

  3. Css3动态伪类

    通常我们可以用CSS中伪类和js中的鼠标事件来定义. 动态伪类 起作用的元素 描述 :link 只有链接 未访问的链接 :visited 只有链接 访问过的链接 :hover 所有元素 鼠标经过元素 ...

  4. phpEXCEL操作全解

    phpExcel中文帮助手册,列举了各种属性,以及常用的操作方法,难得是每一个都用实例加以说明,希望对大家有所帮助. phpExcel中文帮助手册,不可多得的好文章,供大家学习参考. 1.设置exce ...

  5. 百度SEO优化

    下面是一些SEO优化的基本步骤: 一.内部优化 (1)TITLE,KEYWORDS,DESCRIPTION等的优化 (2)内部链接的优化,包括相关性链接,锚文本链接,各导航等链接页 (3)每天保持站内 ...

  6. 文成小盆友python-num17 - django基础

    一.首先了解web应用的本质 对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. 下面利用socket实现一个简单的web框架: #!/usr/b ...

  7. C程序设计语言练习题1-17

    练习1-17 编写一个程序,打印长度大于80个字符的所有输入行. 代码如下: #include <stdio.h> // 包含标准库的信息. #define MAXROW 10 // 最大 ...

  8. START WITH CONNECT BY PRIOR 链表查询

    使用场景:排序 设计思路,id为主键,index为顺序,index存前一个节点的id,当然,按照这个思路可以实现双向链表的(preindex存前一个节点,nextindex存下一个节点) 这样的话排序 ...

  9. 『电脑技巧』破解Win7/Win8登录密码

    Pic via baidu 0x 00 破解思路 用户的明文密码经过单向Hash加密生成Hash散列,Hash散列又被加密存放在系统盘\Windiws\System32\config文件下 要获得明文 ...

  10. 1像素HR技巧(兼容各浏览器)

    hr{color:#ccc;height:1px;border:0px;border-top:1px solid #ccc;margin:0px;padding:0px;overflow:hidden ...