2016-07-05 59 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]; 
});