2014-12-09 4 views
0

이미지가 포함 된 항목이 포함 된 TableView를 보여주는 앱을 작성하고 있습니다. I에 포함 된 선택 수행 이미지를 설정 한 후dispatch_async로 이미지 데이터를 가져온 후 UITableViewCell을 새로 고침

cell.detailTextLabel.text = [artistData objectForKey:generesKey]; 
dispatch_async(backgroundQueue, ^{ 
     NSURL *url_img = [NSURL URLWithString:[artistData objectForKey:pictureKey]]; 
     NSData* data = [NSData dataWithContentsOfURL: 
         url_img]; 
     cell.imageView.image = [UIImage imageWithData:data]; 
     [self performSelectorOnMainThread:@selector(refreshCell:) withObject:cell waitUntilDone:YES]; 
    }); 

: 나는 cellForRowAtIndexPath 방법 내부 코드 줄을 실행하여 이미지를 가져 오기 위해 노력하고있어

-(void)refreshCell:(UITableViewCell*)cell{ 
    [cell setNeedsDisplay]; 
    [self.view setNeedsDisplay]; 
    [self.tableViewOutlet setNeedsDisplay]; 
} 

그리고 이미지를 표시되지 않습니다하지만 난 때 클릭 셀 또는 전체 목록을 스크롤하면 이미지가 표시됩니다. 내 View가 상쾌하지 않은 이유는 무엇입니까? 내가 뭔가를 놓친 건가?

+0

비동기 이미지 다운로드를위한 프레임 워크를 사용하는 것이 훨씬 쉽습니다. 예를 들어 SDWebImage https://github.com/rs/SDWebImage를 입력하면 다음과 같이 입력하면됩니다. [cell.imageView sd_setImageWithURL : [NSURL urlWithString : @ "http : //somelink.png"]] ' –

답변

2

당신은 항상 당신이 성공적으로 당신이 결과를 캐시 할 수 있습니다 이미지를 다운로드하면 무한 루프를 방지하기 위해

[self.tableView [email protected][indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];를 호출하여 세포를 다시로드 할 수 있습니다. 얼마나 오래 캐시 할 것인가는 당신에게 달렸습니다.

NSCache *imageCache = [[NSCache alloc] init]; 
imageCache.name = @"My Image Cache"; 
UIImage *image = [imageCache objectForKey:url_img]; 
if (image) { 
    cell.imageView.image = image; 
} else { 
    // Do your dispatch async to fetch the image. 

    // Once you get the image do 
    [imageCache setObject:[UIImage imageWithData:data] forKey:url_img]; 
} 

당신은 imageCache가 ViewController 수준의 속성이되기를 원할 것입니다. 매번 하나씩 만들지 마십시오. cellForRowAtIndexPath

+0

이로 인해 cellForRowAtIndexPath를 호출하는 루프가 막히게됩니다. 새로 고침하고이 메서드를 호출하기 때문입니다. – Preetygeek

+0

그럼 이미지를 캐시하고 대신 사용할 수 있습니다. 임시 캐싱을 위해 NSCache를보고 있습니다. – aahrens

0

배경 대기열에서 UI와 상호 작용하는 것과 관련이있을 수 있습니다. 이 시도 :

dispatch_async(backgroundQueue, ^{ 
    NSURL *url_img = [NSURL URLWithString:[artistData objectForKey:pictureKey]]; 
    NSData* data = [NSData dataWithContentsOfURL:url_img]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     cell.imageView.image = [UIImage imageWithData:data]; 
    }); 
}); 
+0

아니요, 이것은 작동하지 않는 경우 클릭하거나 스크롤 한 후에도 여전히 이미지가 표시됩니다./ – Preetygeek

관련 문제