遇到一个典型问题:客户端从Server分页拉取一组数据。如图所示:(iOS图示)
用户点击View1的“查看”,进入View2.客户端在View2,触发从Server拉取数据。【问题】:
由于Server的数据很大,比如有1000条数据。客户端为了【减少数据流量】没有必要一次全部拉下来,客户端采用分页拉取(例如:分五页拉取,每次拉取200人)。参考具体的场景:
-> 如果是首次进入View2,没有缓存,则拉取第一页(0-199条),获取后并保存到本地,如果用户继续往上滑动列表到达底部,触发拉取第二页(200—399条)的事件。-> 此时,用户没有兴趣继续往下看了,反而滑动列表到顶部,触发重新获取列表的操作。如果没有版本号控制,那么客户端扔需要重新拉取第一页。这是流量的浪费。-> 那么,加入版本号控制!客户端和Server增加一个版本号version。看似解决了问题。-> 似乎加入版本号更复杂啦:
从无缓存说起,第一页上传version=0,Server必然返回第一页的结果,客户端做缓存;
但是,第一页完成后,需要更新客户端的version为最新么?
1. 更新version至最新,那么获取第二页的时候,Server一看version跟自己一样,不给客户端数据了。
2. 不更新version,等到所有数据完成后再更新version,如果用户拉取第一页后,采取了全量拉取,仍会造成第一页数据流量的浪费。
参考其他App,比如“头条”客户端,也是这种模式。是怎么实现的呢?
期待大家帮忙思考!!!

解决方案 »

  1.   

    版本号的你可以采取xxx.xxx的形式,最后一个xxx表示页数,前面的版本号可以表示其他的概念
    更新到第几页客户端版本号就已此页的分页号来标识
    服务器比较的时候同时比较两个xxx具体的版本号
      

  2.   

    可以加入过期时间请求得时候,如果服务器发现他自己得数据被更新了,才返回数据,客户端得到最新数据更新UI否则返回一个标示,告诉你客户端现在已经是最新数据了,没必要刷新界面,那客户端就不更新UI了,而且只返回一个标示,数据量很小
      

  3.   


    谢谢!有一个场景:
    客户端有一页缓存(旧缓存),Server的version=10(Server端数据增加了一条“马六”)
    第一页,version=9,
    第二页,version=0,(没有缓存)
    此时,用户拉取第二页,Server给了第二页,这里面是没有“马六”的。因为“马六”音序排序,靠前排到第一页中了。
    【问题】当Server端变化时候,可能造成客户端数据不准确!
    ---------------------
    另外一个场景:当Server数据减少,客户端也会不准确!
      

  4.   

    如果数据涉及到变更的话就不好解决了,你始终就需要对客户端的数据和服务器数据进行匹配。
    比如你添加一条“马六”,并且第一页中,那么等于以前所有的cache都不准确了。
    这个确实麻烦