我有这个递归函数,它会等待图像加载完毕。 但是,它不能正常工作。 UIImageView 永远不会更新。
(image参数是class类型的字段,使用Alamofire下载)
既然UIImage是引用类型,那么错误是什么?
func waitForImage(image: UIImage?, imageName: String, imageView: UIImageView, waitTimeInSec: Double = 0.5, repeatCount: Int = 0) {
let maxWaits = 10
if image != nil {
imageView.image = image
}
else {
if repeatCount > maxWaits {
return
}
delay(waitTimeInSec) {
self.waitForImage(image, imageName: imageName, imageView: imageView,
waitTimeInSec: waitTimeInSec, repeatCount: repeatCount + 1)
}
}
}
延迟定义为:
func delay(delay:Double, closure:()->()) {
dispatch_after(
dispatch_time(
DISPATCH_TIME_NOW,
Int64(delay * Double(NSEC_PER_SEC))
),
dispatch_get_main_queue(), closure)
}
下面是我调用函数的方式:
waitForImage(item.owner.picture, imageName: "Owner's Avatar, \(item.owner.ID)", imageView: ivAvatar)
最佳答案
我相信您想要的不是对图像的引用,而是对图像的引用,您可以通过制作 image
和 inout 参数来获得该图像。所以也许是这样的:
func waitForImage(inout image: UIImage?, imageName: String, imageView: UIImageView, waitTimeInSec: Double = 0.5, repeatCount: Int = 0)
这样调用它:
waitForImage(&item.owner.picture, imageName: "主人头像,\(item.owner.ID)", imageView: ivAvatar)
在仔细考虑之后,另一种仍然可以提供您想要的通用解决方案的替代方法是创建如下协议(protocol):
protocol ImageProvider {
var providedImage: UIImage? { get }
}
然后让 item.owner 类符合它。然后调整 waitForImage
:
func waitForImage(imageProvider: ImageProvider, imageName: String, imageView: UIImageView, waitTimeInSec: Double = 0.5, repeatCount: Int = 0) {
let maxWaits = 10
if imageProvider.providedImage != nil {
imageView.image = imageProvider.providedImage
}
else {
if repeatCount <= maxWaits {
delay(waitTimeInSec) {
self.waitForImage(imageProvider, imageName: imageName, imageView: imageView,
waitTimeInSec: waitTimeInSec, repeatCount: repeatCount + 1)
}
}
}
然后这样调用它:
waitForImage(item.owner, imageName: "所有者头像,\(item.owner.ID)", imageView: ivAvatar)
关于ios - Swift:在 GCD 中使用引用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36724608/