2013-04-08 3 views
2

NSFetchedResultsController과 함께 응용 프로그램에서 핵심 데이터를 사용하여 테이블을 채 웁니다. 내 데이터베이스에는 40k + 항목이있어서 테이블이 다소 길다. 각 표 셀에는 SDWebImage을 사용하여 웹에서로드 된 미리보기 이미지가 있습니다. 천천히 스크롤하면 모든 작품이 훌륭합니다. 몇 초 안에 빠르게 스크롤하면 충돌이 발생합니다.UITableViewCell 할당 해제시기 결정

NSZombies가 유용하지 않은 것을 보여줍니다.

나는 그것이 웹에서 로딩하고 SDWebImage과 관련이 있다고 생각합니다. 방법 SDWebImage은 백그라운드에서 이미지를로드 한 다음 다운로드가 완료된 후 다운로드 한 이미지를 설정하는 것입니다 (말). 내 생각에 세포가 UITableView에 의해 할당 해제되고 난 후, SDWebImage은 할당 해제 된 셀에 이미지를 설정하려고 시도합니다. 따라서 UITableViewCell이 할당 해제 될시기를 결정할 수 있다면 SDWebImage 다운로드 프로세스를 중단하고 문제를 해결할 수 있습니다.

나는

- (void)dealloc { 
    NSLog(@"dealloc"); 
} 

셀 할당이 해제 될 것입니다하지만 난 아무것도 결코 때 잡기 위해 추가 시도했습니다.

편집 하위 클래스 UITableViewCell에 내 -(void)dealloc 메서드가 있습니다.

편집 여기 어디에/내가 내 사용자 지정 셀에 셀

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
static NSString* inventoryCellID = @"InventoryCustomCellID"; 

InventoryCustomCell* cell = (InventoryCustomCell *)[tableView dequeueReusableCellWithIdentifier:inventoryCellID forIndexPath:indexPath]; 

[self configureCell:cell atIndexPath:indexPath]; 

return cell; 
} 


- (void)configureCell:(InventoryCustomCell *)cell atIndexPath:(NSIndexPath *)indexPath { 

    [cell formatCellWithProduct:[fetchedResultsController objectAtIndexPath:indexPath] enableAdding:NO]; 

    cell.openThumbnailButton.tag = indexPath.row; 

    [cell.openThumbnailButton addTarget:self action:@selector(presentThumbnailViewWithCell:) forControlEvents:UIControlEventTouchUpInside]; 
} 

을 만드는 방법이 호출되는 구성 방법입니다 :

- (void)formatCellWithProduct:(Product*)product enableAdding:(bool)addingEnabled { 

    self.titleLabel.text = product.part_number; 
    self.partNumberLabel.text = [[[product.manufacturer allObjects] objectAtIndex:0] name]; 

    //The SDWebImage UIImageView category method 
    [self.thumbImageView setImageWithURL:[NSURL URLWithString:product.photo] placeholderImage:[UIImage imageNamed:@"icon.png"]]; 
} 

편집 여기 가있다 SDWebImage 메서드는 이미지를 다운로드하고 설정합니다.

- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletedBlock)completedBlock; 
{ 
    [self cancelCurrentImageLoad]; 

    self.image = placeholder; 

    if (url) 
    { 
     __weak UIImageView *wself = self; 
     id<SDWebImageOperation> operation = [SDWebImageManager.sharedManager downloadWithURL:url options:options progress:progressBlock completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished) 
     { 
      __strong UIImageView *sself = wself; 
      if (!sself) return; 
      if (image) 
      { 
       sself.image = image; 
       [sself setNeedsLayout]; 
      } 
      if (completedBlock && finished) 
      { 
       completedBlock(image, error, cacheType); 
      } 
     }]; 
     objc_setAssociatedObject(self, &operationKey, operation, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
    } 
} 
+0

u를 말하는 악기는 무엇입니까? – vikingosegundo

+0

파기가 필요했지만 'setImageWithURL'완료 블록이 할당 해제 된 인스턴스로 전송되고 있음을 발견했습니다. 그래서 내 가정은 옳았다. 셀이 TableView에 의해 할당 해제되는 것을 알 수있는 방법을 찾아야한다. – random

+0

해당 블록을 게시하십시오. 셀 재사용 때문에 셀 재배치에 의존해서는 안됩니다. – vikingosegundo

답변

12

테이블 뷰는 테이블 뷰 셀을 할당하고 할당 취소하는 경향이 크지 않습니다. 셀을 생성하는 것은 비용이 많이 들기 때문에 가능한 경우 화면에서 사라지면 삭제되지 않고 재사용됩니다.

UITableViewDelegate-tableView:didEndDisplayingCell:forRowAtIndexPath:은 다운로드를 취소하거나 더 이상 관련이없는 작업을 취소하기 위해 셀을 업데이트하는 더 좋은 장소입니다.

-setImageWithURL:etc:etc:에 대한 각 호출이 해당 이미지보기에 대한 이전 다운로드를 취소하려고 시도하는 것처럼 보입니다.

+1

당신은 선생님입니다. 도와 줘서 고마워. – random

0

당신의 dealloc 방법을 넣어 않았다 어디 당신은 설명하지 않았다 .. 난 당신이 셀의 할당 해제가 호출되는 경우 (단지 테스트 디버깅을 위해 당신의 ViewController에 TU 범주를하지 추가 할 수 있습니다 고려

서브 클래스 UITableviewCell).

@implementation UITableViewCell(Dealloc) 

- (void)dealloc { 
    NSLog(@"dealloc"); 
    [super dealloc]; 
} 

@end 

는 ARC를 사용하십니까 : 예를 들어

? 더 이상 깜박하지 않은 경우

InventoryCustomCell* cell = (InventoryCustomCell *)[[tableView dequeueReusableCellWithIdentifier:inventoryCellID forIndexPath:indexPath] autorelease]; 
+0

내 질문을 업데이트했지만 UITableViewCell의 하위 클래스에 dealloc 메서드가 있습니다. – random

+0

cellForRow .. 메서드를 표시하십시오. –

+0

질문이 있습니다. 업데이트되었습니다. 도움을 주셔서 감사합니다. – random

관련 문제