docs: Hybrid、领域驱动设计与 BFF、项目复盘

This commit is contained in:
LiuBinPeng
2021-08-24 09:51:28 +08:00
parent d819a88652
commit 55a89dc4a5
13 changed files with 237 additions and 66 deletions

View File

@@ -4,11 +4,11 @@
App 的性能问题是影响用户体验的重要因素之一。性能问题主要包含Crash、网络请求错误或者超时、UI 响应速度慢、主线程卡顿、CPU 和内存使用率高、耗电量大等等。大多数的问题原因在于开发者错误地使用了线程锁、系统函数、编程规范问题、数据结构等等。解决问题的关键在于尽早的发现和定位问题。
xf 本篇文章着重总结了 APM 的原因以及如何收集数据。APM 数据收集后结合数据上报机制,按照一定策略上传数据到服务端。服务端消费这些信息并产出报告。请结合[姊妹篇](https://github.com/FantasticLBP/knowledge-kit/blob/master/Chapter1%20-%20iOS/1.80.md) 总结了如何打造一款灵活可配置、功能强大的数据上报组件。
本篇文章着重总结了 APM 的原因以及如何收集数据。APM 数据收集后结合数据上报机制,按照一定策略上传数据到服务端。服务端消费这些信息并产出报告。请结合[姊妹篇](https://github.com/FantasticLBP/knowledge-kit/blob/master/Chapter1%20-%20iOS/1.80.md) 总结了如何打造一款灵活可配置、功能强大的数据上报组件。
## 一、卡顿监控
卡顿问题,就是在主线程上无法响应用户交互的问题。影响着用户的直接体验,所以针对 App 的卡顿监控是 APM 里面重要的一环。
卡顿问题,程度较低就是掉帧,比如用户在滑动某个列表的时候会有不流畅的体验,但是应用程序还是可以相应的。严重些就是 ANR就是短时间在主线程上无法响应用户交互的问题。影响着用户的直接体验,所以针对 App 的卡顿监控是 APM 里面重要的一环。
FPSframe per second每秒钟的帧刷新次数iPhone 手机以 60 为最佳iPad 某些型号是 120也是作为卡顿监控的一项参考参数为什么说是参考参数因为它不准确。先说说怎么获取到 FPS。CADisplayLink 是一个系统定时器,会以帧刷新频率一样的速率来刷新视图。 `[CADisplayLink displayLinkWithTarget:self selector:@selector(###:)]`。至于为什么不准我们来看看下面的示例代码
@@ -2697,6 +2697,7 @@ CFNetwork 使用 CFReadStreamRef 来传递数据,使用回调函数的形式
}
@end
```
@implementation NetworkDelegateProxy
@@ -2713,31 +2714,31 @@ CFNetwork 使用 CFReadStreamRef 来传递数据,使用回调函数的形式
});
return _sharedInstance;
}
}
#pragma mark - public Method
+ (instancetype)setProxyForObject:(id)originalTarget withNewDelegate:(id)newDelegate
{
{
NetworkDelegateProxy *instance = [NetworkDelegateProxy sharedInstance];
instance->_originalTarget = originalTarget;
instance->_NewDelegate = newDelegate;
return instance;
}
}
- (void)forwardInvocation:(NSInvocation *)invocation
{
{
if ([_originalTarget respondsToSelector:invocation.selector]) {
[invocation invokeWithTarget:_originalTarget];
[((NSURLSessionAndConnectionImplementor *)_NewDelegate) invoke:invocation];
}
}
}
- (nullable NSMethodSignature *)methodSignatureForSelector:(SEL)sel
{
{
return [_originalTarget methodSignatureForSelector:sel];
}
}
@end
```
@@ -5538,12 +5539,13 @@ parseJSError(line, column);
});
return _sharedManager;
}
```
#pragma mark - public Method
- (void)startMonitor
{
{
APMMLog(@"crash monitor started");
#ifdef DEBUG
@@ -5569,14 +5571,14 @@ parseJSError(line, column);
}
- (void)installKSCrash
{
{
[[APMCrashInstallation sharedInstance] install];
[[APMCrashInstallation sharedInstance] sendAllReportsWithCompletion:nil];
[APMCrashInstallation sharedInstance].onCrash = onCrash;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
_isCanAddCrashCount = NO;
});
}
}
```
在 `installKSCrash` 方法中调用了 `[[APMCrashInstallation sharedInstance] sendAllReportsWithCompletion: nil]`,内部实现如下