關於使用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”幾個字眼明顯就該想到是調用先前的方法啊,我傻了我,還糾結這麼久)。。。。記錄一下,提醒自己下次細心點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章