什么是MVC
MVC:Model应该包括数据,和数据的操作,View只应该有UI,不应该处理任何业务逻辑,以及数据填充,Controller处理Model与View的交互以及其他逻辑,在实际开发中我们经常将Model传递给View,比如给tableviewCell填充数据,我们所用的并不是标准的理论MVC
什么是MVVM
http://www.cocoachina.com/articles/15823
说说你适配了哪些地方
刘海屏适配:
对没有navigationbar的页面顶部视图空出44像素
页面底部控件空出来34
全屏的tableview底部空出34的contentinset
(全局的东西通过修改宏实现)
ios11之后提供了safeAreaLayoutGuide,safeAreaInsets可以用来做安全区域的布局
ios11适配:
tableview设置offset达不到想要的结果和mjrefresh加载更多时候跳动,设置estimatedRowHeight,estimateSectionHeaderHeight,estimateSectionFooterHeight禁止tableview的估算达到自己想要的效果
MGSwipeTableCell出现崩溃,升级最新版就行
首页弹出框Manager的重构
原来设计:
最开始首页只有3,4个弹框,使用AlertManager管理,这些弹出框的网络请求,逻辑判断全部在AlertManager里面,弹出框展示是线性的,随着首页功能的不断增加,增加更多弹框,之前的弹框顺序也有变化,AlertManager代码变得不可维护
现在设计:
WMStartAlertQueue处理弹出框通用逻辑,弹出框自己管理自己的数据请求,数据展示,如果当前弹出框数据展示结束,调用下面代码
self.showOver = YES;
[[WMStartAlertQueue sharedInstance] showAlert];
关键代码
/**
获取网络数据
*/
- (void)getNetData {
for (WMStartAlertNewBaseModel *model in self.array) {
[model getNetData];
}
}
/**
显示弹出框
*/
- (void)showAlert {
//广告图加载没有结束,直接返回
if (!self.adOver) {
return;
}
WMStartAlertNewBaseModel *model;
for (WMStartAlertNewBaseModel *obj in self.array) {
if (obj.showOver == NO) {
model = obj;
break;
}
}
if (model.getData) {
[model showAlert];
}
}
WMStartAlertNewBaseModel
@interface WMStartAlertNewBaseModel : NSObject
@property (nonatomic, assign) BOOL getData;//是否已经获取到数据,默认NO
@property (nonatomic, assign) BOOL showOver;//是否显示结束,默认NO
/**
获取网络数据
*/
- (void)getNetData;
/**
显示弹出框
*/
- (void)showAlert;
@end
WMStartAlertQueue
@interface WMStartAlertQueue : NSObject
@property (nonatomic, strong) UIViewController *viewController;//载体
@property (nonatomic, assign) BOOL adOver;//广告图是否加载完成
+ (instancetype)sharedInstance;
- (void)addObject:(id)obj;
- (void)insertObject:(id)obj;
/**
获取网络数据
*/
- (void)getNetData;
/**
显示弹出框
*/
- (void)showAlert;
/**
断开执行链
*/
- (void)breakChain;
调用者
WMStartAlertQueue *alertQueue = [WMStartAlertQueue sharedInstance];
alertQueue.viewController = self;
WMVersionUpdateModel *versionUpdate = [WMVersionUpdateModel new];
self.colorfulEggModel = [WMColorfulEggModel new];
WMNewUserModel *newUser = [WMNewUserModel new];
WMPushAlertModel *pushAlert = [WMPushAlertModel new];
WMPrivacyModel *privacyModel = [WMPrivacyModel new];
[alertQueue addObject:versionUpdate];
[alertQueue addObject:privacyModel];
[alertQueue addObject:self.colorfulEggModel];
[alertQueue addObject:newUser];
[alertQueue addObject:pushAlert];
[alertQueue getNetData];
layout动画怎么做
在UIView 的animationBlock里面添加layoutIfNeeded(立即刷新)/setNeedsLayout(下个刷新循环)
项目中具体做过哪里的性能优化
如何查找启动速度慢的原因
- pre main阶段,系统加载可执行文件,加载动态库,Xcode 中 Edit scheme -> Run -> Auguments 将环境变量 DYLD_PRINT_STATISTICS 设为 1,控制台就能打印出pre main的时间,一般来说大部分时间占用都是动态库
- main阶段,didFinishLaunchingWithOptions,HomeViewController的viewDidLoad ViewWillAppear,可以通过instruments的time profile去检测这几个函数里面的耗时操作
首页启动速度优化
- 把不必要的初始化操作放到子线程去做,比如某些三方sdk的初始化
- 把主页面不是必须在viewDidLoad,viewWillAppear里面执行的操作,放到后面去执行,例如viewDidAppear
- 可以懒加载的对象,进行懒加载
网友评论