UITableView加載網絡數據是一個很常見的需求,可是要完全理解仍是須要認真學習一下的。javascript
首先新建一個空的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獲取簡單的網絡數據就介紹完了。