在两个Uiview控制器之间发送UIImage是否合适?
我正在研究CS193P Spring的任务4 - Smashtag。
我必须实现提及表视图(这是推特的其他数据:提及,标签,图像,网址)。我必须将图像放在适当的单元格中。为此我已经下载了它。之后如果用户点击其中一个图像它应该转到另一个UIViewController,用户可以在其中缩放和滚动图像。
在我看过的很多例子中,人们发送图像的网址并一次又一次地获取它(对于提到的控制器和另一个的相同图像)。我认为这会降低性能。所以我在控制器之间发送UIImage对象。
但这是对的吗?
// MARK: - Navigation
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == Storyboard.SearchSegue {
if let svc = segue.destinationViewController as? SearchResultsTableViewController {
if let cell = sender as? TextTableViewCell {
if let text = cell.hashtagLabel.text {
if text.hasPrefix("@") || text.hasPrefix("#") {
svc.searchText = text
}
}
}
} else if let svc = segue.destinationViewController as? ImageViewController {
if let cell = sender as? ImagesTableViewCell {
svc.image =
}
}
}
}
svc.image是var:
var image: UIImage? {
get {
return imageView.image
}
set {
imageView.image = newValue
imageView.sizeToFit()
scrollView?.contentSize = imageView.frame.size
}
}
和cell.imageVar
var imageVar: UIImage? {
get {
return imageField.image
}
set {
imageField.image = newValue
spinner.stopAnimating()
}
}
获取功能
private func fetchImage () {
if let u = url {
spinner?.startAnimating()
dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0)) {
let contentsOfURL = NSData(contentsOfURL: u)
dispatch_async(dispatch_get_main_queue()) {
if u == self.url {
if let imageData = contentsOfURL {
self.imageVar = UIImage(data: imageData)
} else {
self.spinner.stopAnimating()
}
}
}
}
}
}
答案 0 :(得分:0)
只有在您使用不同的图片尺寸时才有意义。例如,如果您在单元格中使用图像,则应使用小图像,缩略图,以加快下载速度。然后,当您看到细节并想要缩放图像时,您应该使用更大的图像(因此您必须使用URL检索它)。 但是如果你只有一个图像大小,那么通过视图控制器传递UIImage是完全正确的。
答案 1 :(得分:0)
您可以考虑缓存图像。您可以将图像保存在文档目录中,并使用其链接在其他位置加载。但是,您需要记住的一件事是,您需要跟踪您希望以这种方式缓存图像的时间,以及删除它们的机制。如果您只想将图像用于一个会话,您甚至可以选择使用NSCache。