- 慎用同步处理,绝对不要进行同步主线程处理这种该操作!
- 维护和使用自己的线程,避免使用系统线程,减少与使用方冲突的机会。
- SDK 初始化除非失败否则只允许初始化1次。 一个惨痛的教训:
SDK 启动的方法中进行了主线程同步处理,本来因为有本地缓存的查为了预防使用方乱掉导致数据竞争做的(因为一些功能没有开放,使用方发现启动方法可以帮助他们达成,会各个地方调用,导致数据混乱)。
没想到使用方将我们的 SDK 使用单例封装,启动的时候在子线程启动,并在 -applicationDidBecomeActive:
方法中使用了单例的其他方法。结果出现了死锁。
死锁原因:
因为单例使用的是一下方法。
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
});
这个方法会在初始化未完成的时候在调用的位置进行同步等待。子线程初始化的时候,主线程使用会进行同步等待。当我们 SDK 进行主线程同步处理的时候就发生了死锁。
虽然说现在使用 framework 是存在命名空间,但是最好还是进行区分(不区分会出现警告 详情:2019-01-23 引用相同类测试)。
结论:
- 所有 category 方法加前缀。
- 所有类名都应该加前缀。
其他的后续再继续补充...