在两个控制器之间发送UIImage是否正确?

时间:2016-06-30 10:49:11

标签: ios swift design-patterns model-view-controller computer-science

在两个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()
                        }
                    }
                }
            }
        }
}

2 个答案:

答案 0 :(得分:0)

只有在您使用不同的图片尺寸时才有意义。例如,如果您在单元格中使用图像,则应使用小图像,缩略图,以加快下载速度。然后,当您看到细节并想要缩放图像时,您应该使用更大的图像(因此您必须使用URL检索它)。 但是如果你只有一个图像大小,那么通过视图控制器传递UIImage是完全正确的。

答案 1 :(得分:0)

您可以考虑缓存图像。您可以将图像保存在文档目录中,并使用其链接在其他位置加载。但是,您需要记住的一件事是,您需要跟踪您希望以这种方式缓存图像的时间,以及删除它们的机制。如果您只想将图像用于一个会话,您甚至可以选择使用NSCache。