2016-07-05 5 views
0

VC1にUITableviewを実装しました。セルにいくつかのJSONデータを表示します。 Modelクラスを実装して、データをテーブルビューに渡しました。テーブルビューのデータがモデルクラスを通過する

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がループの外側にあると宣言しているので、tcは1つだけです。ループの最初の反復で必要な変更を加えたら、_tableArrayに追加します。 2回目の反復では、最初の反復で使用された同じ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]; 
}); 
内の宣言を与えます
関連する問題