定时改变App主题的方案

时间:2023-03-08 17:21:35

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];
}