关于使用JSPatch重写setter方法

来源:互联网 发布:淘宝店如何提升销量 编辑:程序博客网 时间:2024/06/07 07:30

本博客迁移来自: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