(资料图片)
优化后CPU使用情况:
日志上传策略1.当APP调用SDK的init方法初始时,在init方法中会开启一个倒计时,在5s后使用子线程进行发起上传。2.上传方法调用后,日志工具会遍历本地日志目录下的日志文件,并将日志文件创建成NSData。3.然后日志工具逐个读取未上传成功标记的日志数据进行data拼接。4.每当一个Data日志拼接后会判断当前批次拼接的Data的大小是否大于100k, 如果大于则把数据放入请求参数,异步发送一个网络请求,重新创建一个Data可变对象。5.循环执行3-4操作,直到所有的本地日志都发送到后台当前日志上传策略逻辑清晰,但是存在一个问题。虽然每个上传请求都是使用子线程上传不影响主线程,但是当本地日志量大时,比如有10M日志,那么可能会同时发生100条请求,并在同一时间段内集中对日志数据进行编码和特殊字符替换。这样直接就把CPU资源抢光了,所以会造成APP卡顿。解决方法以时间换空间,用户对日志上传时无感知的,只要不影响APP的使用就好。按照这个原则上传策略可以改为只使用一个线程,让这100个上传请求做串行上传。如何让子线程的网络请求串行执行呢?将上传方法在成功回调中做递归调用。递归出口是判断带上传的日志个数,如果个数大于0就继续递归调用上传,否则就什么也不做,结束上传操作。另外,通过后台配置上传开关,在SDK调用时从后台请求到上传开关保存到本地,等上传时读取开关配置信息,判断是否开启上传。这样可用于紧急情况关闭日志上传功能。关键词: