iOS 收藏篇

【效率】像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.png
3.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保存看看效果吧。

5. 注意事项

上一篇下一篇

猜你喜欢

热点阅读