【效率】像flutter一样实时编译
2020-07-23 本文已影响0人
沉江小鱼
1. 效果
之前写flutter最爽的莫过于热重载(hot reload)功能,如果iOS开发也支持的话,那么效率肯定会大大的提高了,我们本次的目的就是:代码在保存之后,立马在模拟器上看到修改后的效果
。
img注意:只是在模拟器上有效果哦!
2. 背景
每次写页面,最烦的就是盲写UI,只能重新编译运行才能看到效果,让技术含量占比不大的重复性工作占用了大量的时间,尤其是项目越来越大,编译越来越慢,所以为了提高开发效率,终于找到了这个成吨减少工作量的方案,很简单,就跟把大象装进冰箱一样,分为三步:
1. 下载InjectionIII工具
2. 选定项目目录
3. 导入写好的文件
无需其他任何配置,不对项目结构造成任何侵害。
3. 开始,一步步教你
3.1 工具下载 InjectionIII
InjectionIII 是我们需要用到个一个工具,不要因为要用一个工具而错过这个大大提升工作效率的方案,它很简单,并且免费。
app store 搜索:InjectionIII
App Store链接: https://itunes.apple.com/cn/app/injectioniii/id1380446739?mt=12
3.2 配置路径
打开InjectionIII工具,选择Open Project,选择你的代码所在的路径,然后点击Select Project Directory保存。
image.png image.png3.3 创建配置文件
3.3.1 创建配置文件
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface InjectionIIIHelper : NSObject
@end
#import "InjectionIIIHelper.h"
#import <objc/runtime.h>
#import <objc/message.h>
@implementation InjectionIIIHelper
/**
InjectionIII 热部署会调用的一个方法,
runtime给VC绑定上之后,每次部署完就重新viewDidLoad
*/
void injected (id self, SEL _cmd) {
//vc 刷新
if ([self isKindOfClass:[UIViewController class]]) {
[self loadView];
[self viewDidLoad];
[self viewWillLayoutSubviews];
[self viewWillAppear:NO];
}
//view 刷新
else if ([self isKindOfClass:[UIView class]]){
UIViewController *vc = [InjectionIIIHelper viewControllerSupportView:self];
if (vc && [vc isKindOfClass:[UIViewController class]]) {
[vc loadView];
[vc viewDidLoad];
[vc viewWillLayoutSubviews];
[vc viewWillAppear:NO];
}
}
}
/**
获取view 所属的vc,失败为nil
*/
+ (UIViewController *)viewControllerSupportView:(UIView *)view {
for (UIView* next = [view superview]; next; next = next.superview) {
UIResponder *nextResponder = [next nextResponder];
if ([nextResponder isKindOfClass:[UIViewController class]]) {
return (UIViewController *)nextResponder;
}
}
return nil;
}
+ (void)load
{
#if DEBUG
//注册项目启动监听
__block id observer =
[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidFinishLaunchingNotification object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
//更改bundlePath
[[NSBundle bundleWithPath:@"/Applications/InjectionIII.app/Contents/Resources/iOSInjection.bundle"] load];
[[NSNotificationCenter defaultCenter] removeObserver:observer];
}];
// //给UIViewController 注册injected 方法
// class_addMethod([UIViewController class], NSSelectorFromString(@"injected"), (IMP)injected, "v@:");
// //给uiview 注册injected 方法
// class_addMethod([UIView class], NSSelectorFromString(@"injected"), (IMP)injected, "v@:");
// //统一添加 injected 方法
class_addMethod([NSObject class], NSSelectorFromString(@"injected"), (IMP)injected, "v@:");
#endif
}
@end
4. 验证效果
截屏2020-07-23 下午6.12.40.png模拟器运行项目这就说明可以喽,然后敲代码,command+s保存看看效果吧。