从异步调用返回图像

时间:2017-01-13 05:44:24

标签: ios swift asynchronous firebase firebase-storage

我有一个选择器视图,其中包含图像作为可滚动项目。我需要从我的数据库中提取这些图像,以便我收到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
    }
}

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

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

1 个答案:

答案 0 :(得分: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
    }
}

随意建议编辑以使其更好:)