从零开始设计搭建ios App框架(八)

请求策略


  • 场景一
    当用户进入产品列表页面后,相信大部分程序开发者做法是用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;

是不是很简单!
共同学习进步!
感谢您的阅读!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,359评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,270评论 25 709
  • iOS网络架构讨论梳理整理中。。。 其实如果没有APIManager这一层是没法使用delegate的,毕竟多个单...
    yhtang阅读 10,652评论 1 23
  • 雨帘在风中变成了一条条倾斜的平行线,一个没有雨具的女人,右手拿着个包顶在头上,左手前后摆动配合双腿快速的奔跑…… ...
    空格儿阅读 2,773评论 3 2
  • 我的记账APP:随手记 我用随手记坚持不到1年,都只是单独做日常支出记账,我从来都没有都没有认真分析数据,没有去寻...
    晓晓002阅读 780评论 0 1