我添加了一个表视图,我在单元格中显示图像。我还添加了这段代码:
根据图像调整细胞大小。
当我启动我的应用程序时,我得到了这个:[![在此输入图像描述] [1]] [1]
图像不加载,直到我开始滚动...如果我向下滚动页面的一半然后回到顶部,我明白了:哪个是正确的
[![在此处输入图像说明] [2]] [2]
有什么想法吗?我已经在google上进行了研究并尝试了旧版Xcode的奇怪解决方案,但似乎没有任何效果!
以下是TableViewController的其余代码:
答案 0 :(得分:2)
在cellForRowAtIndexPath
委托方法中未正确加载图片,您(可能)在后台下载图片,因此在图片准备好之前会返回cellForRowAtIndexPath
。
下载的图像可能会缓存到某处,以便下次正确加载。
post.downloadImage()
最好在下载图像时调用回调闭包,将下载的图像分配到正确的单元格中。
请记住,用户可能会在加载图像之前将此单元格滚出屏幕,因此如果单元格已更改,则最好使用唯一ID来中止下载的图像分配。
以下是在后台下载图像然后将其分配给单元格的方法的示例 -
+ (void)loadImage:(NSString *)imageUrl onComplete:(void(^)(UIImage *image, BOOL loaded, NSString *callIdentifier))callback callIdentifier:(NSString *)callIdentifier {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul), ^{
[self downloadPicture:url onComplete:^(UIImage *image, BOOL loaded) {
dispatch_sync(dispatch_get_main_queue(), ^{
callback(image, loaded, callIdentifier);
});
}];
});
callback([UIImage imageNamed:@"placeholder"], NO, callIdentifier);
}
+ (void)downloadPicture:(NSString *)url saveTo:(NSString *)filePath onComplete:(void (^)(UIImage *image, BOOL loaded))onComplete {
NSError *error = nil;
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:url] options:NSDataReadingMappedAlways error:&error];
if (!error) {
UIImage *image = [UIImage imageWithData:data scale:GTUserPictureScale];
if (onComplete)
onComplete(image, YES);
} else {
NSLog(@"Error loading user picture: %@", [error description]);
if (onComplete)
onComplete([UIImage imageNamed:@"missing"], NO);
}
}
- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// ...
__weak MyClass *wself = self;
self.imageUrl = @"http://...";
[self loadImage:self.imageUrl onComplete:^(UIImage *image, BOOL loaded, NSString *callIdentifier) {
@synchronized(wself) {
if ([callIdentifier isEqualToString:wself.imageUrl]) {
if (loaded) {
wself.image = image;
}
} else
NSLog(@"Expired load image request for id %@", callIdentifier);
}
} callIdentifier:self.imageUrl];
// ...
}