2011-09-09 9 views
1

프로필 이미지를 NSMutableDictionary에 저장하는 이미지 캐싱 클래스가 있습니다. 키가 존재하면 캐시는 UIImage 객체를 반환하고 그렇지 않으면 캐시를 다운로드하여 사전에 저장하고 UIImage를 반환합니다. 이 공유 캐시는이 같은 NSThreaded 방법 내에서 호출됩니다UITableViewCell 스레드에서 이미지 캐싱

[NSThread detachNewThreadSelector:@selector(setImageForUser:) toTarget:self withObject:imageUrlString]; 

-(void)setImageForUser:(NSString *)imageUrlString { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    LPImageCacher *imageCache = [LPImageCacher sharedCache]; 
    UIImage *profileImg = [imageCache getCachedImageFromMemory:imageUrlString]; 
    self.userProfileImageView.image = profileImg; 
    if (profileImg == nil) { 
     imageUrlString = [[myGlobals sharedInstance].avatarUrlDefault stringByAppendingString:@"/avatar.png"]; 
     self.userProfileImageView.image = [imageCache getCachedImageFromMemory:imageUrlString]; 
    } 

    [pool release]; 
} 

문제 아무것도로드하기 전에 그들이 jQuery과 스크롤하면 이미지가 백 로그 취득 후 결국 모든 이미지를로드하고이 깜박 것으로 변경 현재 셀에 올바른 셀이 나타날 때까지 각 셀에 NSThread의 인스턴스를 생성하고 -prepareForReuse의 스레드를 취소하는 것이 좋을 것이라고 생각했지만 NSThread 객체를 다시 사용할 수없는 것처럼 보입니다.이 문제를 해결하는 방법에 대한 아이디어가 있습니까?

답변

0

리드 올센이 직접 응답을주었습니다. 나는 다른 것을 언급하고 싶다.

각 셀의 쓰레드를 처리하는 데 비용이 많이 드는 데 왜 NSOperationQueue을 사용하지 않을까요? 각 개별로드를 수행하는 작업자 스레드 집합을 가질 수 있으며,이 대기열을 함수에서 항상 최대 표시 셀 수로 제한하는 것이 좋습니다. 이것은 거의 "재사용 스레드"입니다.

실제로 나는 ASIHTTP의 ASINetworkQueue를 사용하는 것이 좋습니다. NSOperationQueue보다 사용하는 것이 더 간단합니다.

또한 스크롤 속도가 특정 수치보다 낮 으면 셀을로드하는 간단한 최적화를 추가하십시오. 이미지를 보려고 멈추지 않을 때 이미지를로드하는 것을 왜 방해합니까?

있는 tableView가 빠르게 이동 될 때 새로운 이미지의로드를 무시
- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    static float prevOffset = 0.0; 
    static float scrollSpeed = 0.0; 

    // positive -> downwards 
    scrollSpeed = scrollView.contentOffset.y - prevOffset; 

    if (scrollSpeed < 2.0) 
    { 
     [self loadImagesForVisibleCellsInTableView:(UITableView*)scrollView]; 
    } 
    else if (scrollSpeed < 6.0) 
    { 
     shouldLoadImages = YES; 
    } 
    else 
    { 
     shouldLoadImages = NO; 
    } 

    prevOffset = scrollView.contentOffset.y; 
} 

, 그것은 그것을 중지에 대한 때와 (shouldLoadImages로드 이미지를 무시하는 그들에게 말하고, tableView:cellForRowAtIndexPath에 영향을 미치는) : 예를 들어, 내가있는 tableView이 같은 것을 썼다 보이는 세포를 재 장전한다.