func tableVIEw(tableVIEw: UItableVIEw,cellForRowAtIndexPath indexPath: NSIndexPath) -> UItableVIEwCell { let cell = tablevIEw.dequeueReusableCellWithIDentifIEr("cardSelectionCell",forIndexPath: indexPath) as! MyCell let card = fetchedResultsController.objectAtIndexPath(indexPath) as! Card cell.name?.text = card.name var image: NSData = card.photo as NSData cell.logo.image = UIImage(data: image) let date = NSDate() let formatter = NSDateFormatter() formatter.timeStyle = .MediumStyle cell.policyExpiryDate.text = formatter.stringFromDate(date) return cell }
但问题是,当我开始滚动时,tableVIEw非常迟钝
所以我试图创建一个字典来转换vIEwDIDLoad()中的图像
var imageDictionary = [Card:UIImage]()AllCards = context.executeFetchRequest(request,error: nil) as! [Card] for card in AllCards { imageDictionary[card] = UIImage(data: card.photo as NSData) }
并在tableVIEw函数中:
cell.logo.image = imageDictionary[card]
但它仍然落后
还有一个问题:如果一张卡被添加到核心数据中,我必须再次获取图像数组,所以我尝试在vIEwDIDAppear()中创建数组但是图像没有出现在第一次加载中而tableVIEw仍然是滞后.
解决方法 首先,它取决于你的图像大小:var image: NSData = card.photo as NSDatacell.logo.image = UIImage(data: image)
这条线可能很重.您可以像这样轻松地测量它,例如:
let time1 = CACurrentMediaTime()var image: NSData = card.photo as NSDatacell.logo.image = UIImage(data: image)print(CACurrentMediaTime() - time1)
如果需要花费很多时间(例如超过8毫秒),那么应该优化它.您可以通过多种方式执行此 *** 作,例如,您可以将UIImage引用存储在某些字典或数组中,然后传递给cellForIndexPath:中的显示.
另一种方式是AsyncKit方式 – 使您的UI同步,在一个线程中加载数据并将其传递给仅在主线程上绘制.现在你所有的进程都在主线程中.
UPD:我认为在这种情况下最好的方法是将pathes存储到图像中,然后在后台运行UIImage调整大小并返回预览.你也可以为调整大小和未调整大小的UIImage制作缓存,路径或URL可以是一个键 – 所以下次只需要从缓存中取出UIImage而不是再次启动所有调整大小的过程.
还要注意这个 *** 作:
cell.logo.image = UIImage(data: image)
创建一个系统缓存并可以在内存中进行大量分配,因为垃圾收集器不会立即杀死它,就像使用UIWebVIEw一样.所以你可以在你的函数周围添加你自己的自动释放池:
autoreleasepool { () -> () in cell.logo.image = UIImage(data: image)}总结
以上是内存溢出为你收集整理的ios – UITableView在显示图像时显着滞后全部内容,希望文章能够帮你解决ios – UITableView在显示图像时显着滞后所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)