Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从url加载UIImage需要很长时间_Ios_Swift_Uitableview_Uiimage - Fatal编程技术网

Ios 从url加载UIImage需要很长时间

Ios 从url加载UIImage需要很长时间,ios,swift,uitableview,uiimage,Ios,Swift,Uitableview,Uiimage,我有一个包含很多UITableViewCell的UITableView,我使用这段代码将内容和图像加载到UITableCell,但是为每个UITableViewCell显示图像需要很长时间 将代码放入dispatch_async中会使滚动停止,但加载图像仍然需要时间 考虑到我有很多像Facebook或Instagram这样的图片,如何让它更快地加载图片 谢谢。听起来你的图像大小可能很大,因为代码看起来不错,通常像FB/Insta这样的应用程序会使用低分辨率的格式副本,然后在需要时加载高分辨率的格

我有一个包含很多UITableViewCell的UITableView,我使用这段代码将内容和图像加载到UITableCell,但是为每个UITableViewCell显示图像需要很长时间

将代码放入dispatch_async中会使滚动停止,但加载图像仍然需要时间

考虑到我有很多像Facebook或Instagram这样的图片,如何让它更快地加载图片


谢谢。

听起来你的图像大小可能很大,因为代码看起来不错,通常像FB/Insta这样的应用程序会使用低分辨率的格式副本,然后在需要时加载高分辨率的格式副本

大多数人使用像SDWebImage这样的图像获取库,因为这将异步获取图像并缓存它们,因此您不必将它们保存在模型上并消耗内存


听起来你的图像大小可能会很大,因为代码看起来不错,通常像FB/Insta这样的应用程序会使用低分辨率的格式副本,然后在需要时加载高分辨率的格式副本

大多数人使用像SDWebImage这样的图像获取库,因为这将异步获取图像并缓存它们,因此您不必将它们保存在模型上并消耗内存


使用以下库之一将图像异步加载到您的视图:

1异步图像视图


2 SDWebImage

使用以下库之一将图像异步加载到您的视图中:

1异步图像视图


2由于异步调用和可重用性,SDWebImage将出现问题。假设您在IndexPath 1处的图像正在加载图像,但下载仍然需要时间,同时用户在另一个索引(即15)处向下滚动,在内部,索引1的同一单元格被分配给索引15,如果您没有处理之前对同一单元格实例的调用,则单元格1的图像将显示在单元格15中。这就是为什么最好使用一些缓存库,如@SeanLintern88所说的或

事件如果您想这样做,那么最好使用子类化,它将帮助您管理呼叫及其终止


在您的情况下,映像的加载可能是因为从服务器加载的实际映像的大小。CDN这类服务提供了一些易于实现的技术,可以根据需要为不同大小的图像提供服务。因此,即使用户上传了1200x1200大小的图像,但在列表屏幕上,您可以获取其120x120大小的图像,这有助于加快加载速度,并节省物理内存。

由于异步调用和可重用性,将出现问题。假设您在IndexPath 1处的图像正在加载图像,但下载仍然需要时间,同时用户在另一个索引(即15)处向下滚动,在内部,索引1的同一单元格被分配给索引15,如果您没有处理之前对同一单元格实例的调用,则单元格1的图像将显示在单元格15中。这就是为什么最好使用一些缓存库,如@SeanLintern88所说的或

事件如果您想这样做,那么最好使用子类化,它将帮助您管理呼叫及其终止


在您的情况下,映像的加载可能是因为从服务器加载的实际映像的大小。CDN这类服务提供了一些易于实现的技术,可以根据需要为不同大小的图像提供服务。因此,即使用户上传了1200x1200大小的图像,但在列表屏幕上,您可以获取其120x120大小的图像,这有助于加快加载速度,并节省物理内存。

您正在加载的图像的大小是多少?若只是显示缩略图,请确保下载的是分辨率较低的图像的缩略图版本,而不是高分辨率的图像。但最终,你对缓慢的互联网连接到图像源无能为力。如果您可以自己在CDN上缓存它们,这会有所帮助。此外,您的代码不会像这样工作,因为您不会在任何地方缓存图像。因此,当来回滚动时,由于您的loadOnce数组,图像不会再次加载,但它们也不会从缓存中提取,并且出列单元将保留以前存在的图像,这可能是错误行的图像。请按照SeanLintern88所述使用SDWebImage。它是完美的。我在用它too@dirkgroten为什么我需要第二次加载图像,抱歉,但我是swift新手我需要知道为什么,我也会尝试SDWebImage catch n查看结果顺便说一句,我只使用1个图像@DavidSeek进行测试是的,我会尝试:您加载的图像的大小是多少?若只是显示缩略图,请确保下载的是分辨率较低的图像的缩略图版本,而不是高分辨率的图像。但最终,你对缓慢的互联网连接到图像源无能为力。如果您可以自己在CDN上缓存它们,这会有所帮助。此外,您的代码不会像这样工作,因为您不会在任何地方缓存图像。所以当向后滚动时
rth,由于使用loadOnce数组,图像不会再次加载,但它们也不会从缓存中提取,并且出列单元将保留以前存在的图像,这可能是错误行的图像。如SeanLintern88所述,使用SDWebImage。它是完美的。我在用它too@dirkgroten为什么我需要第二次加载图像,抱歉,但我是swift新手,我需要知道为什么,我也会尝试SDWebImage catch n查看结果顺便说一句,我只使用1个图像@DavidSeek进行测试是的,我会尝试:单元格1的图像将显示在单元格15中,您能解释更多信息吗,我认为每一行都是一个索引,所以如果他滚动到索引15,在加载positmg[1]后,它将在单元格15中显示positmg[15],正如我所说的,您使用下载的相同位置ImageData创建图像并在UIImageView中分配它,因此,如果之前某个电话的响应延迟,则其数据将填充在图像上,即使您当前的手机不是该手机。或者你应该设置一个检查条件,检查下载的数据是否用于当前的IndexPath。单元格1的图像将显示在单元格15中。你能解释更多关于这一点吗?我认为每行都是一个索引,所以如果他滚动到索引15,它将在单元格15中显示postimg[15],在加载postimg[1]后,如我所说,您正在使用下载的相同LocationImageData创建图像并在UIImageView中分配它,因此,如果以前某个调用的响应延迟,则其数据将填充到图像上,即使您当前的单元格不是该单元格。您应该设置一个检查条件,检查下载的数据是否用于当前的IndexPath。
var loadOnce : [String] = []

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{

    let cell = tableView.dequeueReusableCellWithIdentifier("ProfileActivities", forIndexPath: indexPath) as! ProfileActivitiesTableViewCell


    if !loadOnce.contains("\(indexPath.row)") {

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
            let LocationImage = self.postmap[indexPath.row]
            let LocationImageUrl = NSURL(string: LocationImage)
            let LocationImageData = NSData(contentsOfURL: LocationImageUrl!)

            let ProfileImage = self.postimg[indexPath.row]
            let ProfileImageUrl = NSURL(string: ProfileImage)
            let ProfileImageData = NSData(contentsOfURL: ProfileImageUrl!)

            dispatch_async(dispatch_get_main_queue(), {
                cell.locationImg.image = UIImage(data: LocationImageData!)
                cell.activitesProfileImg.image = UIImage(data: ProfileImageData!)
            });
        });
        loadOnce.append("\(indexPath.row)")

    }
    return cell
}