• UITableView加载网络数据的优化


    UITableView加载网络数据的优化

    效果

    源码

    https://github.com/YouXianMing/Animations

    //
    //  TableViewLoadDataController.m
    //  Animations
    //
    //  Created by YouXianMing on 16/2/2.
    //  Copyright © 2016年 YouXianMing. All rights reserved.
    //
    
    #import "TableViewLoadDataController.h"
    #import "V_2_X_Networking.h"
    #import "TableViewLoadDataRootModel.h"
    #import "LoadUrlDataCell.h"
    #import "CellDataAdapter.h"
    #import "NSString+LabelWidthAndHeight.h"
    #import "UIFont+Fonts.h"
    #import "UIView+SetRect.h"
    #import "MessageAlertView.h"
    #import "GCD.h"
    
    @interface TableViewLoadDataController () <UITableViewDelegate, UITableViewDataSource, NetworkingDelegate>
    
    @property (nonatomic, strong) UITableView                         *tableView;
    @property (nonatomic, strong) V_2_X_Networking                    *dataNetworking;
    @property (nonatomic, strong) NSMutableArray <CellDataAdapter *>  *datasArray;
    
    @property (nonatomic, strong) MessageAlertView                    *showLoadingView;
    
    @end
    
    @implementation TableViewLoadDataController
    
    - (void)setup {
        
        [super setup];
        
        [self createDataSource];
        
        [self createTableView];
        
        [self startNetworking];
    }
    
    - (void)createDataSource {
        
        self.datasArray = [NSMutableArray array];
    }
    
    - (void)startNetworking {
        
        self.showLoadingView             = [[MessageAlertView alloc] init];
        self.showLoadingView.message     = @"loading...";
        self.showLoadingView.contentView = self.contentView;
        [self.showLoadingView show];
        
        self.dataNetworking = [V_2_X_Networking getMethodNetworkingWithUrlString:@"https://api.app.net/stream/0/posts/stream/global"
                                                               requestDictionary:nil
                                                                 requestBodyType:[HttpBodyType type]
                                                                responseDataType:[JsonDataType type]];
        self.dataNetworking.delegate        = self;
        self.dataNetworking.timeoutInterval = @(15);
        [self.dataNetworking startRequest];
    }
    
    - (void)createTableView {
        
        self.tableView                = [[UITableView alloc] initWithFrame:self.contentView.bounds];
        self.tableView.delegate       = self;
        self.tableView.dataSource     = self;
        self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
        [self.tableView registerClass:[LoadUrlDataCell class] forCellReuseIdentifier:@"LoadUrlDataCell"];
        [self.contentView addSubview:self.tableView];
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        
        return self.datasArray.count;
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        
        CellDataAdapter *adapter = self.datasArray[indexPath.row];
        
        CustomAdapterTypeCell *cell = [tableView dequeueReusableCellWithIdentifier:adapter.cellReuseIdentifier];
        cell.dataAdapter            = adapter;
        [cell loadContent];
        
        return cell;
    }
    
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
        
        CellDataAdapter *adapter = self.datasArray[indexPath.row];
        
        return adapter.cellHeight;
    }
    
    #pragma mark - NetworkingDelegate
    
    - (void)requestSucess:(Networking *)networking data:(id)data {
        
        [self.showLoadingView hide];
        TableViewLoadDataRootModel *rootModel = [[TableViewLoadDataRootModel alloc] initWithDictionary:data];
        
        if (rootModel.meta.code.integerValue == 200) {
            
            [GCDQueue executeInGlobalQueue:^{
            
                for (int i = 0; i < rootModel.data.count; i++) {
                    
                    DataModel *dataModel = rootModel.data[i];
                    
                    if (dataModel.user.infomation.text.length <= 0) {
                        
                        continue;
                    }
                    
                    NSDictionary *fontInfo   = @{NSFontAttributeName: [UIFont HeitiSCWithFontSize:14.f]};
                    CGFloat       height     = [dataModel.user.infomation.text heightWithStringAttribute:fontInfo fixedWidth:Width - 80];
                    CGFloat       cellHeight = height <= 50 ? 10 + 50 + 10 : 10 + height + 10;
                    CellDataAdapter *dataAdapter = [CellDataAdapter cellDataAdapterWithCellReuseIdentifier:@"LoadUrlDataCell" data:dataModel
                                                                                                cellHeight:cellHeight cellType:0];
                    [self.datasArray addObject:dataAdapter];
                }
                
                [GCDQueue executeInMainQueue:^{
                    
                    NSMutableArray *indexPaths = [NSMutableArray array];
                    for (int i = 0; i < self.datasArray.count; i++) {
                        
                        [indexPaths addObject:[NSIndexPath indexPathForItem:i inSection:0]];
                    }
                    
                    [self.tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationFade];
                }];
            }];
            
        } else {
        
            AbstractAlertView *alertView     = [[MessageAlertView alloc] init];
            alertView.message                = @"No data now.";
            alertView.contentView            = self.contentView;
            alertView.autoHiden              = YES;
            alertView.delayAutoHidenDuration = 2.f;
            [alertView show];
        }
    }
    
    - (void)requestFailed:(Networking *)networking error:(NSError *)error {
        
        [self.showLoadingView hide];
        AbstractAlertView *alertView     = [[MessageAlertView alloc] init];
        alertView.message                = @"Network error.";
        alertView.contentView            = self.contentView;
        alertView.autoHiden              = YES;
        alertView.delayAutoHidenDuration = 2.f;
        [alertView show];
    }
    
    @end

    细节

  • 相关阅读:
    网络编程之粘包问题
    网络编程初识和socket套接字
    面向对象三大特性
    面向对象进阶
    面向对象初接触
    常用模块(模块初步了解)
    异常处理
    Ubutu Chrome 出现adobe flash is out of date的解决方法
    cmder默认的命令提示符λ改成$
    css在盒子中垂直居中和固定居中
  • 原文地址:https://www.cnblogs.com/YouXianMing/p/5180601.html
Copyright © 2020-2023  润新知