项目总结(我的,还在不断更新中)

前言网络

我认为,进步不单单是取决于你不断的在行走,有时候停下来,整理整理思路,总结以前所遇到的困难,也是一种进步。善于总结,发现之前的不足,而后想办法解决他,这个过程就是进步的开始,我不认为作得多就必定成长快,可是,作了不去思考确定是成长不了的,只能说是一直在原地踏步。固然这样的工做你须要不断的去摸索,而后获得一套本身以为合理的项目模块分类,让项目变得易扩展、易维护。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

相关文章
相关标签/搜索