新旧头像如何处理,需要考虑服务端和客户端两个方面。

通常大公司会将文件上传做成基础服务,跟特定的应用无关。假设这里,文件上传为服务 A, 特定的应用为服务 B,客户端为 C。这时候替换头像大致有两种做法:C 将图片数据上传到 A, 返回一个 url。之后 C 将 url 传给 B。

C 将图片数据上传到 B。而 B 在实现过程当中,调用 A 服务。我倾向于选择 2 的做法,更灵活一些。

有了文件上传这种基础服务,特定应用就不会直接跟文件系统打交道。如何备份,如何容错、CDN 之类的东西都不需要考虑。假如没有这种服务,特定应用 B 可以自己读写文件。服务器端有两种做法,一是有新头像时,保留旧头像。一是有新头像时,删除旧头像。假如保留旧头像,就可以实现头像的历史记录。根据实际情况选择。

最终客户端得到头像图片的 url。

客户端通过 url 下载了图片,通常会缓存图片,使用 url 作为缓存的 key。(这里 url 可以编码成 md5, 只要能通过 url 可以定位到缓存数据就行)。

用户替换了头像之后,客户端的缓存什么时候更新呢?最简单的办法是,每一次替换头像之后,url 都是不同的。这样客户端就没有这条 url 的缓存,之后通过网络获取重新得到头像图片,自然就更新了。那么旧的头像缓存何时删除呢?最简单的办法是不用删除,而提供一个清除缓存的按钮让用户手动删除。

这样下一个问题是如何让每一次替换头像,返回的 url 都是不同的?假如是调用文件上传服务器,不用考虑这个问题,它返回的 url 就是唯一的。假如是自己读写文件,一种方法是每一次都生成一个 uuid, 将 uuid 作为文件名。也可以将图片数据的 md5 值作为文件名。这样返回的 url 样子为:

https://example/heads/0b0d5c01df0d4c36a6334efd7a98b162.jpg

也可以取当前时间值作为 url 的一部分,url 大致为

https://example/123456789/head.jpg?timestamp=1485701510261

这样在服务器读写文件时候,就自然直接删除了旧的头像文件。

总结:最简单的做法是让替换头像后,返回的 url 跟之前的不同。客户端的头像缓存自然得到更新,之后客户端可以判断当前磁盘的剩余容量,当容量太小的时候,就弹出一个对话框,让用户手动删除缓存。在 iOS 中,假如将缓存放在 Caches 目录,有时系统也会自动清除。客户端的缓存也可以设置一个过期时间。开源的缓存库中,过期时间,统计剩余容量,这些繁琐的杂事应该已经帮你做了。

ios 刷新头像_想请问各位大大,iOS中新旧头像缓存的策略是什么?如微信,每次更换个人头像后,服务器怎么处理新旧头像?...相关推荐

  1. JAVA中创建的redis对象_详解Java在redis中进行对象的缓存

    java在redis中进行对象的缓存一般有两种方法,这里介绍序列化的方法,个人感觉比较方便,不需要转来转去. 一.首先,在存储的对象上实现序列化的接口 package com.cy.example.e ...

  2. ios 动画设计_动画和讲故事在设计中的力量

    ios 动画设计 As human beings, we've always been fond of storytelling. Just think of campfire stories, Sa ...

  3. ios录制屏幕_如何使您的ios应用免受屏幕截图和录制的影响

    ios录制屏幕 防止在iOS App中捕获和录制屏幕(Preventing Screen Capturing and Recording in iOS App) Thanks to the mobil ...

  4. java与ios的区别_好奇?Android与iOS究竟有什么区别?终于知道了!

    智能手机系统的发展从如今的百花齐放在到三足立鼎,而发展到了现在则是安卓与ios两家平分天下.谁的系统好用?到底是IOS好呢,还是安卓系统好呢?至今没有一个结果.那么Android与iOS到底有什么区别 ...

  5. python 模拟ios提交网络_使用Xcode + Python进行IOS运动轨迹模拟

    前言 在某些app中,需要根据用户的实时位置来完成某些事件 例如跑步打卡软件(步道乐跑).考勤打卡软件(叮叮).某些基于实时位置的游戏(Pokemon Go.一起来捉妖) 一般解决办法是通过使用安卓模 ...

  6. ios safari 模拟器_电脑也能运行iOS?这款iOS模拟器到底靠谱吗

    在电脑里要玩手机应用或游戏,那就得装个模拟器,你还别说有的手机游戏在电脑里玩起来还真的更方便更爽,可惜的是目前只有安卓版的模拟器,iOS版的则因为其系统的封闭性,还很少出现. 今日小编在偶尔间看到一款 ...

  7. ios分屏_【资讯】前iOS设计师主刀?vivo手机新系统发布在即!

    今日,vivo官方微博宣布了vivo全新的系统Origin,官方宣称历时了一年的精心打磨,官方称之为OriginOS. 新系统具体在FuntouchOS上做了哪些升级,或者说这个全新的OnginOS系 ...

  8. 转移到ios下载安卓_安卓应用转移到ios

    安卓应用转移到官方版也叫move to ios,是一款连接安卓与苹果系统的工具.安卓应用转移到相当于安卓系统与苹果系统之间的桥梁,实现两者之间的文件.音乐.视频等资源的传输! 软件介绍 Move to ...

  9. anaconda如何保存python文件_想在Jupyter Notebook(Anaconda)中保存并运行Python脚本

    确保您的ipython笔记本与python脚本位于同一文件夹中.此外,您可能必须在与python脚本相同的文件夹中创建一个空的__init__.py文件,以使导入工作. 由于您可能正在修改您的pyth ...

最新文章

  1. Android端WEEX + HTTPDNS 最佳实践
  2. 【linux排错】error while loading shared libraries: xxx.so.x 错误的原因和解决办法
  3. 这样保养让你皮肤变水嫩 - 健康程序员,至尚生活!
  4. 重磅!阿里巴巴工程师获得 containerd 社区席位,与社区共建云时代容器标准
  5. keras从入门到放弃(十三)卷积神经网络处理手写数字识别
  6. 套接字错误处理函数的封装思想及函数实现
  7. 《星际争霸 / StarCraft 》超经典游戏!
  8. 类加载器-双亲委派-源码分析2
  9. activity5.1初始密码
  10. table: github.com/astaxie/beego/orm.Ormer not found
  11. JAVA知识基础(三):修饰符
  12. Duplicate entry...for key...
  13. mac下编译curl库(处理https的问题)
  14. Quest v31 Passthrough API无法透视的问题解决办法
  15. edge浏览器识别ip地址为手机号的解决办法
  16. Matlab提取ABAQUS后处理文件inp中的节点数
  17. Docker数据管理
  18. Springboot毕设项目高校食堂饭卡管理824ct(java+VUE+Mybatis+Maven+Mysql)
  19. iframe是什么?iframe用法详解。
  20. JavaScript基础学习笔记

热门文章

  1. 手机访问本地配置域名下的项目
  2. System Center Configuration Manager 心得笔记
  3. uniApp开发h5踩坑 px转rpx转rem 1px转2rpx 2倍
  4. 摩拜单车服务器暂时不可用,摩拜单车无响应无法使用怎么回事?扫码解锁秒退解决方法...
  5. List去重的几种方式
  6. JAVA string数组转list去重
  7. 戴尔服务器序列号规则,解密:戴尔13G服务器命名规则和分类
  8. 如何下载网站内的各种视频(mac)
  9. 2020-8-31 收藏一个api 日历用
  10. python int语句_Python语句print(int('20',16),int('101',2))的输出结果是() (2.0分)_学小易找答案...