由于赋值语句的错位,函数总是返回nil

时间:2019-04-03 10:49:14

标签: swift function return

在这样的函数中,我得到一个nil值,但我不明白为什么。中间的代码返回一个图像(我敢肯定,我也检查了一些打印语句)。我不知道怎么可能总是返回nil。就像它忽略了在中间运行的所有代码,而只考虑第一个和最后一个语句。

func getImagesDownloaded(reference: StorageReference) -> UIImage {
    var imagePassedIn : UIImage?
    reference.getData(maxSize: 10*1024*1024) { (data, error) in

        guard let imageObject = UIImage(data: data!) else {print("Error has occurred: \(String(describing: error?.localizedDescription))"); return}
        imagePassedIn = imageObject
    }
    if imagePassedIn == nil {
        print("Error, getImagesDownloaded is not working")
    }
    return imagePassedIn!
}

3 个答案:

答案 0 :(得分:3)

问题在于StorageReference.getData是一个异步函数,但是您试图同步返回一个值。您需要使用完成处理程序来返回异步获取的值。

func getImagesDownloaded(reference: StorageReference, completion: (UIImage?,Error?)->()) {
    reference.getData(maxSize: 10*1024*1024) { (data, error) in
        guard error == nil, let data = data else {
            completion(nil,error)
            return
        }
        guard let image = UIImage(data: data) else {
            completion(nil, FirebaseErrors.expectedImage)
            return
        }
        completion(image,nil)
    }
}

enum FirebaseErrors: Error {
    case expectedImage
}

然后您需要像这样使用它:

getImagesDownloaded(reference: yourStorageReference, completion: { image, error in
    guard let image = image, error == nil else {
        print(error)
        return
    }
    // Assign your image to a UIImageView or do anything else with it inside the closure (before the ending `}`)
    yourImageView.image = image
})

答案 1 :(得分:0)

您正在使用闭包,并且在执行nil检查时可能不会返回imageObject。 Swift是逐行执行的,当您有异步代码时,它将执行下一行,而不会等待结果。

您应该将imagePassedIn移动到关闭位置。

答案 2 :(得分:0)

您正在完成块内设置imagePassedIn。这意味着当您准备好进行设置时,您已经对其进行了重新调整。

简而言之,当使用完成块时,下面的代码将不会等待其完成才能执行。

将您的功能更新为此:

func getImagesDownloaded(reference: StorageReference, _ completion: (UIImage) -> ()) {
    reference.getData(maxSize: 10*1024*1024) { (data, error) in

        guard let data = data, let imageObject = UIImage(data: data) else {print("Error has occurred: \(String(describing: error?.localizedDescription))"); return}
        completion(imageObject)
    } else {
        print("Error, getImagesDownloaded is not working")
    }
}