美文网首页
关于使用JSPatch重写setter方法

关于使用JSPatch重写setter方法

作者: voidxin | 来源:发表于2016-11-14 23:40 被阅读293次

    今天快下班时APP出现一个bug,是由于数组越界造成的,在根据月份去判断当月有几周时接口那边多返回了一周(本来五周返回了六周),导致数组越界。由于是先填写周再查询,这个崩溃是崩在查询里(所以肯定是填写时周数算法出错),所以也不清楚是安卓端的算法出错还是PC端的算法出错,但我能很肯定不是iOS端的错误(实力甩锅)。认真检查了我的算法,发现根据月份计算周数并没有问题,然后安卓那边也检查了一遍,也没有问题。这时刚想把锅甩给PC端,PC端的童鞋也说算法没问题。。顿时没人接锅了啊。。。但崩溃的是我iOS端啊(安卓有万能的try catch大法使它不崩啊)。好吧,无奈背锅吧。。。好在我们有万能的JSPatch,还不至于要发一个新的版本来解决这么一个小问题。
    涉及到这个算法的页面还挺多的(封装的不够),如果涉及到得每个方法都用JSPatch重写一遍的话工程量也太大了。这里我在想有没有什么一劳永逸的方法呢,从数据的源头入手解决而不不修改下游数据的处理算法。恩,那就从接口获取数据转model时开始吧,没错,重写setter方法。由于获取到得是一个数组,那么很显然,重写model中week这个数组的setter方法。
    前几天在swift代码中也这么干过http://www.jianshu.com/writer#/notebooks/2806206/notes/6736829
    今天出错的是OC代码,针对

    setModel : function(model){
        _model = model
    }
    

    代码_model = model的处理时,我当时从JSPatch的issue中看到有人说使用 self.ORIGsetModel(model)即可,当时也没有验证,就一直这么用。前几天文章中提到的修复Swift代码bug中也是这么用的却没有出现什么问题,但今天我用的时候发现了一个很严重的问题,就是JS代码在走到 self.ORIGsetModel(model)这个方法时,它突然去调用原生原来的方法了(那就等于白写了这个方法。
    其实问题就出在今天的setter方法中我是要先对数据进行处理然后再赋值给_model,而之前和昨天的代码中我是无需对model先处理的,一上来先使用self.ORIGsetModel(model)方法,它调用原生方法后对后面我添加的方法并没有影响。。。。。先上今天的代码吧。

    defineClass('WGMonthlyReportModel',{
    
    
        setWeek: function(week) {
        var viewModel = WGMonthPlanWriterViewModel.alloc().init();
        var weekCount = viewModel.calculateAmountWeekForThisMonth();
        var arrCount = week.count();
        var index = 0;
        for (index = 0; index < arrCount; index++) {
            var weekModel = week.objectAtIndex(index);
             var ID = weekModel.ID().integerValue();
            if (ID >= weekCount) {
                weekModel.setID(weekCount);
            }
        }
        
        if (week.count() > weekCount) {
            var weeArr = NSMutableArray.alloc().init();
            var i = 0;
            for (i = 0; i < arrCount - 1; i++) {
                 var weekModel = week.objectAtIndex(i);
                 weeArr.addObject(weekModel);
            }
            //注释的是出错的代码
           //  self.ORIGsetWeek(weeArr);
           self.setValue_forKey(weeArr,"_week");
            return;
    
        }
    
       
         //注释的是出错的代码
         //self.ORIGsetWeek(week);
          self.setValue_forKey(week,"_week");
    }
    },{});
    

    通过代码很清楚的知道,我对week数组先处理了一同,然后又使用self.ORIGsetWeek(week)想实现"_week = week"的使用,殊不知此时已调用了原生的setter方法覆盖了前面写的一捅。固正确的方法应该是使用“ self.setValue_forKey”方法实现“_week = week",比如“ self.setValue_forKey(week,"_week")”,修改之后完美解决,愉快的告诉运营的同事:“bug已解决”!(自己接的锅,含泪也要背着啊)。
    一直以来犯的错误,今天才猛然发现(其实“ORIG”几个字眼明显就该想到是调用先前的方法啊,我傻了我,还纠结这么久)。。。。记录一下,提醒自己下次细心点。

    相关文章

      网友评论

          本文标题:关于使用JSPatch重写setter方法

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