Swift - 无法正常工作IOS 9.2

时间:2015-12-23 15:34:28

标签: ios swift

我添加了一个表视图,我在单元格中显示图像。我还添加了这段代码:

根据图像调整细胞大小。

当我启动我的应用程序时,我得到了这个:[![在此输入图像描述] [1]] [1]

图像不加载,直到我开始滚动...如果我向下滚动页面的一半然后回到顶部,我明白了:哪个是正确的

[![在此处输入图像说明] [2]] [2]

有什么想法吗?我已经在google上进行了研究并尝试了旧版Xcode的奇怪解决方案,但似乎没有任何效果!

以下是TableViewController的其余代码:

1 个答案:

答案 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];

    // ...
}