TableView Array返回null

时间:2016-07-05 07:56:00

标签: ios objective-c json uitableview

我在UITableview中实施了ViewController。我想在TableView中显示一些数据,这些数据是通过JSON提取的。

- (void)getData
{

   NSURLSession*session=[NSURLSession sharedSession];

   NSURLSessionDataTask *dataTask = [session dataTaskWithURL:[NSURL URLWithString:@"https://itunes.apple.com/us/rss/topaudiobooks/limit=10/json"] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

    NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
    NSLog(@"%@", json);

    NSArray*entryarr=[[json objectForKey:@"feed"]objectForKey:@"entry"];


    for (NSDictionary*appDict in entryarr) {
        NSString*title=[[appDict objectForKey:@"im:name"]objectForKey:@"label"];


        NSString*imageStr=[[[appDict objectForKey:@"im:image"]objectAtIndex:2]objectForKey:@"label"];
        NSURL*imageURL=[NSURL URLWithString:imageStr];

        NSData*imageData=[[NSData alloc]initWithContentsOfURL:imageURL];
        [self.imageArray addObject:imageData];
        [self.tittleArray addObject:title];
        [self.termArray addObject:title];

    }

    NSLog(@"%lu %lu %lu",(unsigned long)self.imageArray.count,(unsigned long)self.tittleArray.count,(unsigned long)self.termArray.count);

}];
[dataTask resume];

}

现在,当我将Array分配给TableView Cell时,它给出了Array为Empty。 但是在getData方法中,Array包含10个元素。

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return _tittleArray.count;


}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    NSString*reUse=@"use";
    UITableViewCell*cell=[tableView dequeueReusableCellWithIdentifier:reUse];

    if (cell==nil) {
        cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:reUse];
        cell.textLabel.textColor = [UIColor orangeColor];


    }
    cell.textLabel.text=[self.tittleArray objectAtIndex:indexPath.row];

    cell.imageView.image=[self.imageArray objectAtIndex:indexPath.row];

    return cell;

}

为什么会这样?我该怎么做。?任何人都可以为我提供有效的解决方案吗?

5 个答案:

答案 0 :(得分:1)

好吧,虽然所有其他答案都建议添加

[self.tableView reloadData];
如果您的块在主线程中运行,

可能已经解决了问题,但由于您正在进行另一个线程的网络操作,您将无法从该线程修改UI。你可能想要这样做:

dispatch_async(dispatch_get_main_queue(), ^{
        [self.tableView reloadData];
});

首先,这是一个基本问题,你甚至没有调用重载功能。另一个问题是对事物如何运作的基本理解。因此,无论何时,您的模型已准备好并且已填充但您的UI未更改(假设您调用该函数来更改UI),请尝试查看日志输出,有时它表示您无法更改另一个线程中的UI并检查代码正在运行的线程。

答案 1 :(得分:0)

在块中重新加载表

    NSURLSession*session=[NSURLSession sharedSession];

    NSURLSessionDataTask *dataTask = [session dataTaskWithURL:[NSURL URLWithString:@"https://itunes.apple.com/us/rss/topaudiobooks/limit=10/json"] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

        NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
        NSLog(@"%@", json);

        NSArray*entryarr=[[json objectForKey:@"feed"]objectForKey:@"entry"];


        for (NSDictionary*appDict in entryarr) {
            NSString*title=[[appDict objectForKey:@"im:name"]objectForKey:@"label"];


            NSString*imageStr=[[[appDict objectForKey:@"im:image"]objectAtIndex:2]objectForKey:@"label"];
            NSURL*imageURL=[NSURL URLWithString:imageStr];

            NSData*imageData=[[NSData alloc]initWithContentsOfURL:imageURL];
            [self.imageArray addObject:imageData];
            [self.tittleArray addObject:title];
            [self.termArray addObject:title];

        }
    dispatch_async(dispatch_get_main_queue(), ^{
        [self.tableView Reloaddata];
});

        NSLog(@"%lu %lu %lu",(unsigned long)self.imageArray.count,(unsigned long)self.tittleArray.count,(unsigned long)self.termArray.count);
    }]; [dataTask resume];

    }

答案 2 :(得分:0)

只需从tableView的完成处理程序重新加载dataTaskWithURL

等到Web服务调用完成,因为它是异步调用,因此您的reloaddata tableview将在一段时间后调用。如果数据较大或互联网连接速度较慢,则可能需要很长时间。

您可以在完成处理程序中放置断点,以检查它何时被调用。

您也可以显示活动指示器。

第二件事是确保你的标题,imageStr或imageData不是nil或null。因为你只是打印数组的数量。如果在数组中添加空对象,则会增加计数,但实际值将为空白。

所以,妥善管理一切,你会发现当你犯错误时。

答案 3 :(得分:0)

如果数组计数大于0,则

调用重新加载数据 请参阅以下代码以供参考

- (无效)的getData {

NSURLSession * session = [NSURLSession sharedSession];

NSURLSessionDataTask * dataTask = [session dataTaskWithURL:[NSURL URLWithString:@" https://itunes.apple.com/us/rss/topaudiobooks/limit=10/json"] completionHandler:^(NSData * data,NSURLResponse * response,NSError * error){

NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
NSLog(@"%@", json);

NSArray*entryarr=[[json objectForKey:@"feed"]objectForKey:@"entry"];


for (NSDictionary*appDict in entryarr) {
    NSString*title=[[appDict objectForKey:@"im:name"]objectForKey:@"label"];


    NSString*imageStr=[[[appDict objectForKey:@"im:image"]objectAtIndex:2]objectForKey:@"label"];
    NSURL*imageURL=[NSURL URLWithString:imageStr];

    NSData*imageData=[[NSData alloc]initWithContentsOfURL:imageURL];
    [self.imageArray addObject:imageData];
    [self.tittleArray addObject:title];
    [self.termArray addObject:title];

}


NSLog(@"%lu %lu %lu",(unsigned long)self.imageArray.count,(unsigned long)self.tittleArray.count,(unsigned long)self.termArray.count);

 }];
 [dataTask resume];

 // add reload data
 if([self.termArray count] >0)
// call reload data here
 }

答案 4 :(得分:0)

在调用API之前,只需编写数组对象的like,alloc和init对象。

喜欢,

NSMutableArray *titleArray = [[NSMutableArray alloc] init]; 

用于显示记录的 CellForRowAtIndexPath 方法的所有数组。

并在从Web服务获取所有记录后重新加载表视图数据。

注意:根据您的问题,您将获得空数组,因此请检查给定的解决方案。