dyna是C/S结构的服务,下面将分别讲述Server和Client两端的使用方法:

    Server端:

    • 先上图:

      dyna 服务器使用流程 (2).png

    • 以下是文本讲解:

      1. 如果您的电脑还没有node环境,安装node环境,
        • mac系统可以使用brew安装:brew install node
        • windows系统直接去node官网下载安装,或者找一些安装教程
      2. 安装zp_dyna插件,这个插件可以帮您开启热重载服务
        • mac终端或Windows xshell 运行 :npm i -g zp_dyna
      3. 在需要托管资源文件的工程根目录下创建名为hotLoad.conf.js的配置文件

      作者在gitlab上准备了一个范例工程 ,git链接:
      ssh://git@gitlab.dev.zhaopin.com:2222/tianhao.li/ZPMVVTemplateToolSimplify.git

      http://gitlab.dev.zhaopin.com/tianhao.li/ZPMVVTemplateToolSimplify.git
      可以直接使用里面的hotLoad.conf.js作为您的配置文件,只需要把几个文件路径修改成你指定的即可

      1. 在上一步的配置文件的同级目录下运行服务器开启命令,您有以下两个模式可以选择
        • dyna start (start可以加也可以不加)
          • 这将会开启一个不依赖于当前终端开闭的服务,但是我们看不到log信息
        • dyna terminal
          • 这将会开启一个依赖于当前终端的服务,但我们可以通过终端看到log信息,便于纠错
      2. 至此,一个可以热重载资源文件的服务就开启成功了 , 我们可以运行 dyna stop 来关闭它
    • client端:

      • Android : 作者是一个Android小白,正在努力学习实现中,也欢迎感兴趣的Android大神提供实现
      • iOS : 作者在gitlab上准备了一个名为ZPMDyNaHotReload-iOS的示例工程,可以对照着来看

        • 先上图:

        未命名文件 (3).png

        • 文本讲解:

          1. 链接:`ssh://git@gitlab.dev.zhaopin.com:2222/tianhao.li/ZPMDyNaHotReload-iOS.git`<br /> [`http://gitlab.dev.zhaopin.com/tianhao.li/ZPMDyNaHotReload-iOS.git`](http://gitlab.dev.zhaopin.com/tianhao.li/ZPMDyNaHotReload-iOS.git)
        1. 在您的ios工程中 引入pod库 : pod 'ZPDyNa'pod install
        2. 在Appdelegate写下如下配置代码image.png
        3. 在需要热重载资源文件的控制器中实现下面的协议传入关注哪些资源文件的改动,以及所需要做的刷新处理 协议方法都是可选的 需要什么功能就实现对应的方法
    1. /// 引入热重载管理类
    2. #import <ZPNDVVHotReloadManager.h>
    3. /// 遵循协议 ZPNDHotReloadDelegate
    4. @interface ZPDNTangramDemoViewController ()<ZPNDHotReloadDelegate>
    5. @property (nonatomic, strong) ZPMPositionListTangramView *tangramView;
    6. @property (nonatomic , strong) NSArray *positionList ;
    7. @property (nonatomic , copy ) NSString *adUrl;
    8. @end
    9. @implementation ZPDNTangramDemoViewController
    10. /// 在页面出现的生命周期方法中将热重载的回调目标设置为当前控制器
    11. - (void)viewWillAppear:(BOOL)animated
    12. {
    13. [super viewWillAppear:animated];
    14. [self.navigationController setNavigationBarHidden:YES animated:animated];
    15. [ZPNDVVHotReloadManager resetHotLoadDelegate:self];
    16. }
    17. /// 有模板更新时回调 回调传入模板数组 , 以typee为key 数据为value
    18. - (void)didReloadTemplates:(NSArray<NSDictionary<NSString * , NSData *> *> *)templates
    19. {
    20. [templates enumerateObjectsUsingBlock:^(NSDictionary<NSString *,NSData *> * _Nonnull template, NSUInteger idx, BOOL * _Nonnull stop) {
    21. [self processTemplateReload:template];
    22. }];
    23. }
    24. /// 根据模板的type 来决定是否更新ui
    25. - (void)processTemplateReload:(NSDictionary *)template
    26. {
    27. NSString *type = template[@"type"];
    28. dispatch_async(dispatch_get_main_queue(), ^{
    29. if ([[self focusTemplates] containsObject:type]) {
    30. [self.tangramView reloadBusinessModel];
    31. }
    32. });
    33. }
    34. /// 有tangram json文件重载时回调 数据结构: [{文件名 : json对应的字典数据},{文件名 : json对应的字典数据},...]
    35. - (void)didReloadTMJsons:(NSArray<NSDictionary<NSString * , NSDictionary *> *> *)tmJsons
    36. {
    37. dispatch_async(dispatch_get_main_queue(), ^{
    38. [tmJsons enumerateObjectsUsingBlock:^(NSDictionary<NSString *,id> * _Nonnull jsonMap, NSUInteger idx, BOOL * _Nonnull stop) {
    39. if ([jsonMap[@"name"] isEqualToString:@"TangramMock"])
    40. {
    41. self.tangramView.tangramJson = jsonMap[@"json"];
    42. [self.tangramView reloadData];
    43. }
    44. }];
    45. });
    46. }
    47. /// 当前控制器关注哪些模板数据的改动 传入的是templatelist.properties中等号右侧的名称
    48. - (NSArray<NSString *> *)focusTemplates
    49. {
    50. return @[@"positionCard",@"adCard"];
    51. }
    52. /// 当前控制器关注哪些tangram的json模板的改动 传入的是模板文件名
    53. - (NSArray<NSString *> *)focusTangramJson
    54. {
    55. return @[@"TangramMock"];
    56. }