【问题标题】:is it correct to send UIImage between two controllers?在两个控制器之间发送 UIImage 是否正确?
【发布时间】:2016-11-02 10:05:30
【问题描述】:

在两个 Uiviewcontroller 之间发送 UIImage 是否合适?

我正在做 CS193P Spring - Smashtag 的作业 4。

在那里我必须实现提及表视图(这是推文的一种附加数据:提及、主题标签、图像、网址)。我必须将图像放置到那里的适当单元格。为此,我已经下载了它。之后,如果用户点击其中一个图像,它应该转到另一个 UIViewController,用户可以在其中缩放和滚动图像。

在我见过的许多示例中,人们发送图像的 url 并一次又一次地获取它(提到控制器和另一个相同的图像)。我认为它会降低性能。所以我在控制器之间发送 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()
                        }
                    }
                }
            }
        }
}

【问题讨论】:

  • 请写代码,我可以给你建议。
  • 如果您不想在下载图像时将保存图像传递到文档目录中,并在需要时使用文档目录路径并在不需要时从目录中删除。
  • 我认为如果您使用缓存系统来防止网络使用并加快加载速度,您可以发送图像 url。如果将图像(或图像)保存在内存中,则需要考虑内存管理/泄漏。

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


【解决方案1】:

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

【讨论】:

  • 我获取完整图像并使其适合查看边界override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { let mention = mentions[indexPath.section][indexPath.row] if let media = mention as? MediaItem { return view.bounds.size.width / CGFloat(media.aspectRatio) } else { return UITableViewAutomaticDimension } }
  • 如何下载小图、缩略图?
  • 在我看来,如果您没有 web 服务参数来获取小图像(在单元格中使用),那么我将通过视图控制器传递 uiimage
  • 这取决于webservice,有些有一个可选参数来设置图像大小
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 2020-01-29
    • 1970-01-01
    相关资源
    最近更新 更多