从零开始设计搭建ios App框架(八)
2016-09-24 本文已影响147人
潇水渔翁
请求策略
- 场景一
当用户进入产品列表页面后,相信大部分程序开发者做法是用tableview来展示,产品数据通过网络接口请求从服务器获取,再刷新tableview。偷偷告诉您一个秘密:其实我也是这么干的。
如果用户退出产品列表,再次进入这个产品列表呢,是重复上面和操作吗?如果是,在网络不是很好的情况下,先看到空白页面,得等待一点时间才能正常使用,有没有办法提升一下用户体验呢? - 场景二
还是上述过程,当用户多次进入产品列表与退出产品列表的时间较短(甚至只有十几秒到几秒时间),有没有办法帮用户省点流量呢?
为了提升App的用户体验,数据缓存 + 网络接口请求策略 可以解决类似这种问题。
其实我不说,您应该已经想到具体的实现方案了。
1、当用户进入产品列表时,将请求到的产品数据缓存到本地。
2、当用户退出后第二次进入时,将缓存的数据展示,再加载服务端数据,加载完再重新缓存到本地。
3、当退出也进入的时间比较短时可以直接用本地缓存的数据,不需要再请求网络。
在我这框架中实现这个策略其实很简单,网络接口层模块设计中,就可以轻松加入此逻辑。
只需要在PGCacheManager文件添加少许代码就可以了。
#pragma mark - API请求策略逻辑
- (BOOL)bEnableStrategy:(PGApiType)type
{
BOOL bEnable = YES;
switch(type)
{
case API_TYPE_LOGIN:
{
bEnable = NO;
break;
}
default:
break;
}
return bEnable;
}
- (NSString *)cacheSringWithKey:(NSString *)key
{
NSString *dataString = nil;
NSNumber *timeNumber = [self.allApiKeyTime objectForKey:key];
if(timeNumber)
{
double nTime = [NSDate date].timeIntervalSince1970 - [timeNumber doubleValue];
//时间间隔大于120秒
if(nTime < 120)
{
dataString = (NSString *)[PGCacheManager getApiCacheStringWithKey:key];
}
else
{
[self.allApiKeyTime setObject:[NSNumber numberWithDouble:[NSDate date].timeIntervalSince1970] forKey:key];
}
}
return dataString;
}
再在网络接口的统一入口方法中添加如下代码:
//需要缓存的接口才做缓存处理
if([self bEnableStrategy:type])
{
NSMutableDictionary *dic = [[NSMutableDictionary alloc] init];
[dic setObject:@(type).stringValue forKey:@"apiType"];
[dic addEntriesFromDictionary:param];
NSString *key = [NSString MD5Encrypt:[NSString jsonStringWithDictionary:dic]];
NSString *dataString = [self cacheSringWithKey:key];
if(dataString)
{
[client parseData:dataString];
return;
}
}
相应的数据缓存可以参考: 数据持久化
#pragma mark -
/**
避免API接口频繁的调用。
*/
+ (NSObject *)getApiCacheStringWithKey:(NSString *)key;
/*
缓存接口数据
*/
+ (BOOL)cacheApiData:(NSString *)apiString key:(NSString *)szKey;
是不是很简单!
共同学习进步!
感谢您的阅读!