【问题标题】:Return image from asynchronous call从异步调用返回图像
【发布时间】:2017-05-28 10:34:22
【问题描述】:

我有一个选择器视图,其中包含可滚动项目的图像。我需要从我的数据库中提取这些图像,所以我得到了Unexptected non-void return value in void function 错误。这是我的代码:

func pickerView(_ pickerView: AKPickerView, imageForItem item: Int) -> UIImage {
    let imgRef = FIRStorage.storage().reference().child("profile_images").child(pets[item])
    imgRef.data(withMaxSize: 1 * 1024 * 1024) { (data, error) -> Void in
        // Create a UIImage, add it to the array
        let pic = UIImage(data: data!)
        return pic
    }
}

所以我明白为什么这不起作用,但我很难找出解决这个问题的最佳方法。我能想到的一种解决方案是将图像设置为一些通用照片,直到回调发生,然后将选择器视图的图像更新为检索到的图像。但是,我不知道如何访问单个选择器视图项以更新其图像。

如果有经验的人可以就如何实现将这些项目设置为来自异步调用的数据的目标给我建议,我将不胜感激!

【问题讨论】:

  • 由于这是一个异步函数,最好使用回调。您可以查看我的答案以获取更多信息。
  • 请问您的问题是否得到解决?
  • 问题实际上就是问题。尝试从异步调用中返回 anything 不是这样做的方法,并且违背了异步函数的本质。也不要使用回调,因为这会使代码过于复杂并且难以维护。简单的解决方案是调用 firebase,它将返回闭包中的图像。然后将其附加到一个数组(假设您的 dataSource 是一个数组),然后更新您的选择器视图。
  • @Jay 好的,但是我如何访问选择器视图的单个组件以更改其图像?
  • 一个 UIPickerView 有一个数据源和一个委托,它们为选择器提供所需的数据。通常,pickerView 的实际数据存储在一个数组中,并通过委托调用(例如 numberOfComponentsInPickerView、numberOfRowsInComponent 和 titleForRow)提供给视图。数组很好......一个数组,您可以通过索引或搜索或各种其他技术访问组件(索引)。在你的情况下,当图像被读入时,你将它们添加到数组中,一旦你读入了一个数量,重新加载将从 dataSource 中提取数据的pickerView。

标签: ios swift asynchronous firebase firebase-storage


【解决方案1】:

这里的函数是一个异步函数。在这种情况下,您必须使用回调。您可以通过以下方式重写该函数以达到预期的效果。

func pickerView(_ pickerView:AKPickerView, imageForeItem item:Int, completion:(_ resultImg: UIImage)->Void) {

    let imgRef = FIRStorage.storage().reference().child("profile_images").child(pets[item])
    imgRef.data(withMaxSize: 1 * 1024 * 1024) { (data, error) -> Void in
        // Create a UIImage, add it to the array
        if let pic:UIImage = UIImage(data: data!) {
            completion(pic)
        }
    }
}

可以这样调用:

self.pickerView(pickerView, imageForeItem: 0) { (image) in
    DispatchQueue.main.async {
      // set resulting image to cell here
    }
}

请随时提出修改建议以使其更好:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    • 2014-10-29
    • 1970-01-01
    • 2022-01-19
    相关资源
    最近更新 更多