2016-07-05 2 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 개의 (즉 마지막으로 업데이트 된 값)

루프의 내부 선언을 지정 포함됩니다

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]; 
}); 
관련 문제