2016-07-05 56 views
0

我在VC1中实现了UITableview,我想在单元格中显示一些JSON数据。我已经实现了一个Model类来将数据传递给表视图。Tableview数据通过模型类

dispatch_async(dispatch_get_main_queue(), ^{ 

NSURLSession*session=[NSURLSession sharedSession]; 

NSURLSessionDataTask *dataTask = [session dataTaskWithURL:[NSURL URLWithString:@"https://itunes.apple.com/search?term=music"] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 

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

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

    TableClass *tc = [[TableClass alloc] init]; 

    for (NSDictionary *appDict in entryarr) { 


     //setting title 

     NSString *str = [appDict objectForKey:@"artistName"]; 
     [tc setTittle:str]; 

     NSLog(@"artist Name=%@",tc.tittle); 

     //setting Subtitle 
     NSString *sub = [appDict objectForKey:@"country"]; 

     [tc setSubtittle:sub]; 

     NSLog(@"artist Name=%@",tc.subtittle); 

     //image 

     NSString *imageStr = [appDict objectForKey:@"artworkUrl60"]; 


     NSURL *imageURL = [NSURL URLWithString:imageStr]; 

     [tc setImage:imageStr]; 



     NSData *imageData =[[NSData alloc] initWithContentsOfURL:imageURL]; 

     //[self.imageArray addObject:imageData]; 

     [_tableArray addObject:tc]; 

     NSLog(@"%@ name of tittle",[_tableArray objectAtIndex:0]); 

    } 

    NSLog(@"%lu %lu %lu",(unsigned long)self.tableArray.count,(unsigned long)self.tableArray.count,(unsigned long)self.tableArray.count); 

    [self.tableView reloadData]; 

}]; 
    [dataTask resume]; 
}); 

但是,当它访问到单元格时,我得到了数组中的最后一个元素。

TableClass *tableclassModel = [self.tableArray objectAtIndex:indexPath.row]; 
cell.textLabel.text = tableclassModel.tittle; 
cell.detailTextLabel.text = tableclassModel.subtittle; 
cell.imageView.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:tableclassModel.image]]]; 

为什么如此......?我该怎么做?

回答

0

您一次又一次更改同一个对象的值tc对象。既然你已经声明了tc对象外部for循环,那么将只有一个tc。在循环的第一次迭代中进行所需更改后,您将它添加到_tableArray。在第二次迭代中,您将更改第一次迭代中使用的相同tc对象的值,并将其再次添加到_tableArray。这将用新值更新第一个对象。这正好和最后你的_tableArray将包含相同的值TC对象数为n(即最后更新值)

提供的声明中,for循环

dispatch_async(dispatch_get_main_queue(), ^{ 

NSURLSession*session=[NSURLSession sharedSession]; 

NSURLSessionDataTask *dataTask = [session dataTaskWithURL:[NSURL URLWithString:@"https://itunes.apple.com/search?term=music"] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 

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

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

    for (NSDictionary*appDict in entryarr) { 

     TableClass*tc=[[TableClass alloc]init]; 

     //setting tittl 

     NSString*str=[appDict objectForKey:@"artistName"]; 
     [tc setTittle:str]; 

     NSLog(@"artist Name=%@",tc.tittle); 

     //setting Subtittle 
     NSString*sub=[appDict objectForKey:@"country"]; 

     [tc setSubtittle:sub]; 

     NSLog(@"artist Name=%@",tc.subtittle); 

     //image 

     NSString*imageStr=[appDict objectForKey:@"artworkUrl60"]; 


     NSURL*imageURL=[NSURL URLWithString:imageStr]; 

     [tc setImage:imageStr]; 



     NSData*imageData=[[NSData alloc]initWithContentsOfURL:imageURL]; 

     //[self.imageArray addObject:imageData]; 

     [_tableArray addObject:tc]; 

     NSLog(@"%@ name of tittle",[_tableArray objectAtIndex:0]); 

    } 

    NSLog(@"%lu %lu %lu",(unsigned long)self.tableArray.count,(unsigned long)self.tableArray.count,(unsigned long)self.tableArray.count); 

    [self.tableView reloadData]; 

}]; 
[dataTask resume]; 
});