項目總結(我的,還在不斷更新中)

前言網絡

我認爲,進步不單單是取決於你不斷的在行走,有時候停下來,整理整理思路,總結以前所遇到的困難,也是一種進步。善於總結,發現之前的不足,而後想辦法解決他,這個過程就是進步的開始,我不認爲作得多就必定成長快,可是,作了不去思考確定是成長不了的,只能說是一直在原地踏步。固然這樣的工做你須要不斷的去摸索,而後獲得一套本身以爲合理的項目模塊分類,讓項目變得易擴展、易維護。async

 

我的理解(一)建立合理的工具類--  項目作到必定的程度,多多少少會有不少的代碼冗餘。或者不是說代碼冗餘,而是代碼複用性不高,不一樣的地方重複的代碼不少;就好比說設置字體顏色,這個那個客戶端都是必不可少的,有的人使用#define kColor [UIColor whiteColor]預先定義好顏色,可是這樣內容多的話,不會美觀,這時候咱們能夠建立一個顏色工具類(UIColor+Utils)以下圖;ide

我我的的理解是能用category建立工具類的儘可能用,若是都是用繼承NSObject來建立的話,到最後內容多的話,代碼會不少,不利於維護;更多的工具類以下(借鑑,用於舉例說明);工具

等等。佈局

 

我的理解(二)通用的模板--   其實你們不難發現,不少界面的佈局均可以使用UITableView這個控件進行佈局。若是是單純的列表頁面,能夠建立一個共用的BaseTableViewController,用於控制請求後臺接口的操做、上拉或者下拉刷新的操做等等,而子控制器負責加載顯示數據等等。好比說一下的代碼;字體

#pragma mark - 請求數據

- (void)fetchObjectsOnPage:(NSUInteger)page refresh:(BOOL)refresh
{
    [_manager GET:self.generateURL(page)
      parameters:nil
         success:^(AFHTTPRequestOperation *operation, ONOXMLDocument *responseDocument) {
             _allCount = [[[responseDocument.rootElement firstChildWithTag:@"allCount"] numberValue] intValue];
             NSArray *objectsXML = [self parseXML:responseDocument];
             
             if (refresh) {
                 _page = 0;
                 [_objects removeAllObjects];
                 if (_didRefreshSucceed) {_didRefreshSucceed();}
             }
             
             if (_parseExtraInfo) {_parseExtraInfo(responseDocument);}
             
             for (ONOXMLElement *objectXML in objectsXML) {
                 BOOL shouldBeAdded = YES;
                 id obj = [[_objClass alloc] initWithXML:objectXML];
                 
                 for (OSCBaseObject *baseObj in _objects) {
                     if ([obj isEqual:baseObj]) {
                         shouldBeAdded = NO;
                         break;
                     }
                 }
                 if (shouldBeAdded) {
                     [_objects addObject:obj];
                 }
             }
             
             if (_needAutoRefresh) {
                 [_userDefaults setObject:_lastRefreshTime forKey:_kLastRefreshTime];
             }
             
             dispatch_async(dispatch_get_main_queue(), ^{
                 if (self.tableWillReload) {self.tableWillReload(objectsXML.count);}
                 else {
                     if (_page == 0 && objectsXML.count == 0) {
                         _lastCell.status = LastCellStatusEmpty;
                     } else if (objectsXML.count == 0 || (_page == 0 && objectsXML.count < 20)) {
                         _lastCell.status = LastCellStatusFinished;
                     } else {
                         _lastCell.status = LastCellStatusMore;
                     }
                 }
                 
                 if (self.tableView.mj_header.isRefreshing) {
                     [self.tableView.mj_header endRefreshing];
                 }
                 
                 [self.tableView reloadData];
             });
         }
         failure:^(AFHTTPRequestOperation *operation, NSError *error) {
             MBProgressHUD *HUD = [Utils createHUD];
             HUD.mode = MBProgressHUDModeCustomView;
             HUD.customView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"HUD-error"]];
             HUD.detailsLabelText = [NSString stringWithFormat:@"%@", error.userInfo[NSLocalizedDescriptionKey]];
             
             [HUD hide:YES afterDelay:1];
             
             _lastCell.status = LastCellStatusError;
             if (self.tableView.mj_header.isRefreshing) {
                 [self.tableView.mj_header endRefreshing];
             }
             [self.tableView reloadData];
         }
     ];
}

統一的去管理tableview的刷新數據的操做。而子控制器須要作的就是配置須要訪問的接口API以及其餘是否自動刷新的屬性的設置。fetch

 

我的理解(三)網絡層的封裝--   網絡層對於全部後臺數據交互的客戶端都是必不可少的,對於第三方AFNetworking,本來的API複用性不強,須要咱們本身再次封裝,固然是根據咱們的業務需求來決定。就比我說個人一個項目的一個POST請求的封裝;spa

看以上的代碼就知道只是封裝了接口所必要的一些參數,其餘參數經過parameters傳遞進來,返回的數據也沒有作處理,因此說並非很完善,能夠在內部將數據解析成相應的格式model、NSArray等等,而後經過執行回調block,更新UI。code

相關文章
相關標籤/搜索