# 面试学问 1. 技术面试问你遇到的难题是什么,如何解决的? 在考察你的技术边界 2. 至今遇到过的比较麻烦的技术问题? - 在App首次安装启动的时候,商品列表快速滑动到底部,再向上慢慢滑动,看到商品view上面的文字和价格都显示正确,但是图片显示是有问题的。想到的是由于SDWebImageView图片问题导致的,因为再快速滑动的时候,图片开启了下载任务,但是异步下载的,cell也在复用池了,所以当你停止滑动看到商品view的时候正是之前的其他的图片任务下载结束,这样子再去响应给view设置图片就会造成当前的显示的图片并不是当前model对应的图片。知道问题的原因那么事情就好解决啦。思路就是如何区分当前下载好的cell是不是当前正在现实的cell。所以思路有2个。 - 自定义的 cell 里面可以拿到 model.imageUrl,那么当下载图片完成的时候可以在 block 里面去判断回调完成里面的 url 和 model.imageUrl 是否一致,一致的话就设置图片,否则不设置 - 在 cellForRow 里面去通过 indexPathForCell: 这个 api 拿到 indexPath,然后根据拿到的复用的 indexPath.row 再和当前现实的 indexPath.row 做比较,如果一致则设置图片,不一致则不设置图片 - 代码在编译的时候一直报出问题:某个pod的某个头文件file not found。最后排查问题发现工程中存在2个同名的 Framework,一个版本新、一个版本旧。主工程中链接到旧工程中了,所以一直找不到文件。 ## 网络篇 - [App网络优化](https://blog.cnbang.net/tech/3531/) - [IP 直连](https://www.jianshu.com/p/63a94cb46cd20。SNI:Server Name Indication。一个服务器的 IP 可能对应多个域名,也就说可能有多个 HTTPS 证书,如果在请求的时候不指定具体哪个的证书,服务器可能会返回错误的证书 - 多路复用 ## 系统优化 - [移动端监控体系](https://www.jianshu.com/p/8123fc17fe0e) - [启动时间优化](http://yulingtianxia.com/blog/2016/10/30/Optimizing-App-Startup-Time/) 稳定性、常见的稳定排查、crash率,监控、提升工程效率的工具(性能,效率,安全,成本,体验)、电量优化、看大图体验 ## 思考 组件:重用、解耦。模块:封装、隔离。 架构中,模块复用的第一要求便是代码的功能组件化。组件化意味着拥有独立功能的代码从系统中进行抽象并剥离,再以“插件”的形式插回原有系统中。这样剥离出来的功能组件,便可以供其他APP使用,从而降低系统中模块与模块之间的耦合性;也同时提高了APP之间代码的复用性 借助于 Redux 的方式,将 MVC 更改为 MVCS(s为store)。MVC 中的 view 做到无状态,完全依赖于 Store 中返回的各种状态信息。 组件化之后分为技术组件、公用业务组件、每个业务线都是单独组件。通过把不同功能的组件代码拆分到不同的 pod 里,实现了业务线仅依赖于公共就可以迭代开发。改善了功能开发和协同版本。 流量过大,和服务器交互过多,采用 protoBuf 作为数据载体,有效减小流量消耗。 热修复:JavascriptCore + Aspects 组件化、模块化、热修复、RN 兜底后架构模式: ![App架构](https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/2019-07-05-App-structure.jpeg) - Runtime - 网络 - Hybrid - RN、Weex - JavascoriptCore 如何传递 Block