UITableView介紹 之 加載網絡數據

UITableView加載網絡數據

  UITableView加載網絡數據是一個很常見的需求,可是要完全理解仍是須要認真學習一下的。javascript

加載簡單的字信息

使用蘋果原生的網絡請求API

  首先新建一個空的ios項目,在默認的UIViewController的viewDidLoad方法中初始化UITableView,並實現UITableViewDataSource中的要求的代理方法,具體代碼以下:java

#import "ViewController.h"

// 定義static變量
static NSString *const ID = @"cell";

@interface ViewController ()<UITableViewDataSource>

/**數據源*/
@property (nonatomic, strong) NSMutableArray *dataSource;
/**table引用*/
@property (nonatomic, weak) UITableView *tableView;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.bounds];
    [self.view addSubview:tableView];
    self.tableView = tableView;
    tableView.dataSource = self;
    
    // cell註冊
    [tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:ID];
    
    // 請求數據
    // ......
}

#pragma mark -  代理方法<UITableViewDataSource>
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.dataSource.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    // 先從緩存中找,若是沒有再建立
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
    
    cell.textLabel.text = self.dataSource[indexPath.row];
    
    return cell;
}

/**
 *  數據源懶加載
 */
- (NSMutableArray *)dataSource {
    if (_dataSource == nil) {
        _dataSource = [NSMutableArray array];
    }
    return _dataSource;
}

@end

tableView的基本框架已搭好,剩下的就是處理網絡請求和返回數據的解析ios

 爲了模擬數據web端用Node.js寫了一個小小的http服務器代碼也很是簡單,服務端代碼:git

const http = require('http');
const hostname = '127.0.0.1';
const port = 8000;
// 從外部獲取數據
const data = require('./data.js');

http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/json;charset=UTF-8' });
  // 將數據返回給客戶端
  res.end(JSON.stringify(data));
}).listen(port);

console.log('server is running');

返回Json的格式以下:github

{"data": 
    [
        {
            "text": "光計算機離咱們究竟還有多遠?"
        },
        {
            "text": "Google揭祕SSD可靠性:SLC閃存神話破滅"
        }
        ....
     ]
 }

訪問網絡請求:web

/**
 *  請求網絡數據
 */
- (void)getDataFromWeb {
    NSString *url = @"http:192.168.31.167:8000";
    
    // 建立session
    NSURLSession *session = [NSURLSession sessionWithConfiguration:
            [NSURLSessionConfiguration defaultSessionConfiguration]];
    // 建立請求對象
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
    
    // 爲了防止block中產生循環引用
    __weak typeof (self)weakSelf = self;
    // 建立請求任務
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, 
    NSURLResponse *response, NSError *error) {
        // 請求完成處理
        if (error) {
            NSLog(@"Error :%@", error.localizedDescription);
        } else {
            // 將Json數據解析成OC對象
            NSDictionary *
            dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
            NSMutableArray *arr = [NSMutableArray array];
            NSArray *temp = dict[@"data"];
            
            for (NSInteger i=0; i < temp.count; i++) {
                [arr addObject: [NSString stringWithFormat:@"%zd、%@",(i + 1), temp[i][@"text"]]];
            }
            
            // 在主線程中刷新數據
            [weakSelf performSelectorOnMainThread:@selector(refreshDataSource:) 
                                               withObject:arr waitUntilDone:YES];
        }
        
    }];
    // 啓動請求
    [task resume];
    
}

/**
 *  刷新數據源
 */
- (void)refreshDataSource:(NSArray *)data {
    [self.dataSource addObjectsFromArray:data];
    [self.tableView reloadData];
}

注意:若是是ios9系統要訪問http請求要在plist文件中加入以下代碼json

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>

運行效果api

使用三方框架進行網絡請求

ios的網絡框架比較多,如今比較流行的就是AFNetworking github地址緩存

這個框架基本包含了http請求的全部功能,並且使用起來也比較方便,因此也被普遍應用到不少商業軟件中,獲取AFNetworking的方式大致有兩種,一種是以cocoapods方式獲取而後統一管理框架的版本和框架與框架之間的依賴,另外一種方式直接從github上下載源碼,找到其中的AFNetworking文件夾拖到工程中就能夠了。服務器

使用前先要在ViewController中引入AFNetworking.h,那麼上面的網絡請求代碼就能夠改寫成以下形式:

/**
 *  請求網絡數據
 */
- (void)getDataFromWeb {
    
    // 爲了防止block中產生循環引用
    __weak typeof (self)weakSelf = self;
    
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    [manager GET:@"http:192.168.31.167:8000" parameters:nil progress:nil 
                    success:^(NSURLSessionTask *task, id responseObject) {
        // responseObject已經被解析成了OC
        NSDictionary *dict = responseObject;
        
        NSMutableArray *arr = [NSMutableArray array];
        NSArray *temp = dict[@"data"];
        
        for (NSInteger i=0; i < temp.count; i++) {
            [arr addObject: [NSString stringWithFormat:@"%zd、%@",(i + 1), temp[i][@"text"]]];
        }
        // 因爲這個block是在主線程中執行的因此能夠直接在這裏刷新數據
        [weakSelf refreshDataSource:arr];
    } failure:^(NSURLSessionTask *operation, NSError *error) {
        NSLog(@"Error: %@", error);
    }];
}

使用三方框架後代碼簡潔了很多,關於AFNetworking的其餘用法官方文檔也比較詳細這裏就很少說了,到此UITableView獲取簡單的網絡數據就介紹完了。

相關文章
相關標籤/搜索