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