UITableView
은 TBPostSnapCell이라는 약 10 개의 하위 클래스로 구성된 UITableViewCell
으로 구성되어 있습니다. 각 셀은 초기화 될 때 GCD
을 통해 다운로드되거나 사용자의 문서 디렉토리에 저장된 캐시에서 검색된 UIImage
으로 두 개의 변수를 설정합니다.UITableView 및 GCD로 지연 줄이기
어떤 이유인지, 이로 인해 tableView에서 눈에 띄는 지체가 발생하여 & 테이블의 UX가 중단됩니다.
이 지연을 줄일 수있는 방법을 알려주십시오.
있는 tableView ... cellForRowAtIndexPath :
if (post.postType == TBPostTypeSnap || post.snaps != nil) {
TBPostSnapCell *snapCell = (TBPostSnapCell *) [tableView dequeueReusableCellWithIdentifier:snapID];
if (snapCell == nil) {
snapCell = [[[NSBundle mainBundle] loadNibNamed:@"TBPostSnapCell" owner:self options:nil] objectAtIndex:0];
[snapCell setPost:[posts objectAtIndex:indexPath.row]];
[snapCell.bottomImageView setImage:[UIImage imageNamed:[NSString stringWithFormat:@"%d", (indexPath.row % 6) +1]]];
}
[snapCell.commentsButton setTag:indexPath.row];
[snapCell.commentsButton addTarget:self action:@selector(comments:) forControlEvents:UIControlEventTouchDown];
[snapCell setSelectionStyle:UITableViewCellSelectionStyleNone];
return snapCell;
}
TBSnapCell.m
- (void) setPost:(TBPost *) _post {
if (post != _post) {
[post release];
post = [_post retain];
}
...
if (self.snap == nil) {
NSString *str = [[_post snaps] objectForKey:TBImageOriginalURL];
NSURL *url = [NSURL URLWithString:str];
[TBImageDownloader downloadImageAtURL:url completion:^(UIImage *image) {
[self setSnap:image];
}];
}
if (self.authorAvatar == nil) {
...
NSURL *url = [[[_post user] avatars] objectForKey:[[TBForrstr sharedForrstr] stringForPhotoSize:TBPhotoSizeSmall]];
[TBImageDownloader downloadImageAtURL:url completion:^(UIImage *image) {
[self setAuthorAvatar:image];
}];
...
}
}
TBImageDownloader.m
+ (void) downloadImageAtURL:(NSURL *)url completion:(TBImageDownloadCompletion)_block {
if ([self hasWrittenDataToFilePath:filePathForURL(url)]) {
[self imageForURL:filePathForURL(url) callback:^(UIImage * image) {
_block(image); //gets UIImage from NSDocumentsDirectory via GCD
}];
return;
}
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_async(queue, ^{
UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:url]];
dispatch_async(dispatch_get_main_queue(), ^{
[self writeImageData:UIImagePNGRepresentation(image) toFilePath:filePathForURL(url)];
_block(image);
});
});
}
감사합니다. 우선 순위를 낮음으로 설정해 보았습니다. 지연 시간이 약간 줄어든 것 같습니다. 세마포어를 사용하는 예를 들려 주시겠습니까? –
예제가 제공됩니다. 행운을 빌어 요. – Stripes
샘플 코드를 제공해 주셔서 감사합니다.이 테이블은 현재 지연 시간이 상당히 단축되어 실행 중입니다! 아직 약간의 지연이 남아 있지만 석영 코어 드로잉과 관련이 있다고 생각합니다. –