大神就不用看了,对你来说肯定没什么营养,只针对新手朋友!!!
相信在iOS开发中大家会经常的应用到UITableView控件,于此同时我们也少不了与网络打交道,那么问题就产生了:
为什么我从网络获取到了数据源,但是却在UITableView不能成功显示出来?
下面,我用一个例子来给大家展示
首先这是我自己定义的一个类
- #import "SecondViewController.h"
- @interface SecondViewController ()
- @property NSMutableData *mutableData;
- @property NSString *string;
- @property NSMutableArray *courses;
- @end
- @implementation SecondViewController
- - (void)viewDidLoad {
- NSString *path = @"这是URL地址";
- NSURL *url = [NSURL URLWithString:path];
- NSURLRequest *request = [NSURLRequest requestWithURL:url];
- NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
- [connection start];
- [super viewDidLoad];
- self.classBarItem.badgeValue = nil;
- }
- - (void)didReceiveMemoryWarning {
- [super didReceiveMemoryWarning];
- // Dispose of any resources that can be recreated.
- }
- - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
- NSLog(@"%@", response);
- }
- - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
- if(_mutableData == nil){
- _mutableData = [[NSMutableData alloc]init];
- }
- [_mutableData appendData:data];
- }
- - (void)connectionDidFinishLoading:(NSURLConnection *)connection{
- _string = [[NSString alloc]initWithBytes:[_mutableData bytes] length:[_mutableData length] encoding:NSUTF8StringEncoding];
- NSJSONSerialization *json_courses = [NSJSONSerialization JSONObjectWithData:_mutableData options:0 error:nil];
- NSMutableDictionary *json = [NSJSONSerialization JSONObjectWithData:_mutableData options:0 error:nil];
- _courses = [[NSMutableArray alloc] init];
- for(int i = 0; i < [json count]; i++){
- NSString *tag = @"course";
- NSString *str_i = [[NSString alloc]initWithFormat:@"%i",i];
- tag = [tag stringByAppendingString:str_i];
- NSJSONSerialization *json_course = [json_courses valueForKey:tag];
- NSString *name = [json_course valueForKey:@"courseName"];
- NSLog(@"%@",name);
- [_courses addObject:name];
- }
- NSLog(@"%@",_courses);
- //获取NSMuTableArray中第n个元素的值
- //NSLog(@"%@", [_courses objectAtIndex:1]);
- _mutableData = nil;
- }
- - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
- return 1;
- }
- - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
- NSLog(@"Array count is %i",[_courses count]);
- return [_courses count];
- }
- - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
- UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"courses" forIndexPath:indexPath];
- cell.textLabel.text = [_courses objectAtIndex:[indexPath row]];
- // Configure the cell...
- return cell;
- }
- /*
- // Override to support conditional editing of the table view.
- - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
- // Return NO if you do not want the specified item to be editable.
- return YES;
- }
- */
- /*
- // Override to support editing the table view.
- - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
- if (editingStyle == UITableViewCellEditingStyleDelete) {
- // Delete the row from the data source
- [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
- } else if (editingStyle == UITableViewCellEditingStyleInsert) {
- // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
- }
- }
- */
- /*
- // Override to support rearranging the table view.
- - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
- }
- */
- /*
- // Override to support conditional rearranging of the table view.
- - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
- // Return NO if you do not want the item to be re-orderable.
- return YES;
- }
- */
- /*
- #pragma mark - Navigation
- // In a storyboard-based application, you will often want to do a little preparation before navigation
- - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
- // Get the new view controller using [segue destinationViewController].
- // Pass the selected object to the new view controller.
- }
- */
- @end
程序成功获取到了数据源:
但是,问题就出现了,大家注意到没有,我用来存放网络读取的数据的NSMutableArray的count值为0,但是我也成功获取到了网络数据。
首先,分析,程序先执行输出了盛放我所需数据的长段,然后才从网络获取数据,那么我们就可以推断出,程序必然是先创建了UITableView,之后才获取到了网络数据。
问题产生的原因:程序在获取网络资源时并不会在主线程当中进行,所以程序会先执行之后的代码,然后再来获取网络资源
那么解决这个问题的方法也就明了了,在获取到网络资源后我们需要把它重新加载到tableView上
此时我们只需要在connectionDidFinishLoading末尾添加[self.tableView reloadData];即可
OK,大功告成!
运行结果如下: