我在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;
}
为什么会这样?我该怎么做。?任何人都可以为我提供有效的解决方案吗?
答案 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)
调用重新加载数据 请参阅以下代码以供参考
- (无效)的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服务获取所有记录后重新加载表视图数据。
注意:根据您的问题,您将获得空数组,因此请检查给定的解决方案。