关于使用JSPatch重写setter方法

本博客迁移来自:http://www.jianshu.com/users/465865c268ed/latest_articles
今天快下班时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”几个字眼明显就该想到是调用先前的方法啊,我傻了我,还纠结这么久)。。。。记录一下,提醒自己下次细心点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值