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);
}
}
u를 말하는 악기는 무엇입니까? – vikingosegundo
파기가 필요했지만 'setImageWithURL'완료 블록이 할당 해제 된 인스턴스로 전송되고 있음을 발견했습니다. 그래서 내 가정은 옳았다. 셀이 TableView에 의해 할당 해제되는 것을 알 수있는 방법을 찾아야한다. – random
해당 블록을 게시하십시오. 셀 재사용 때문에 셀 재배치에 의존해서는 안됩니다. – vikingosegundo