美文网首页iOS 收藏篇
【效率】像flutter一样实时编译

【效率】像flutter一样实时编译

作者: 沉江小鱼 | 来源:发表于2020-07-23 18:16 被阅读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. 注意事项

    相关文章

      网友评论

        本文标题:【效率】像flutter一样实时编译

        本文链接:https://www.haomeiwen.com/subject/nxnhlktx.html