ios - Swift:在 GCD 中使用引用类型

标签 ios swift grand-central-dispatch

我有这个递归函数,它会等待图像加载完毕。 但是,它不能正常工作。 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/

相关文章:

ios - 如何在 iOS 后台运行 NSURLConnection

ios - NSManagedObjectContext performBlockAndWait : and dispatch_semaphore causing a deadlock

ios - 每天从特定记录类型中删除所有 CloudKit 记录

ios - 在 iOS 上持续跟踪用户位置

ios - 如何在不使用 Marmalade 中的 s3eImagePicker 的情况下从 Gallery 获取所有文件?

ios - 来自 iOS 静态框架的“无法在 bundle 中加载 NIB”

swift - 多个原型(prototype)电池的不同高度

arrays - 如何在 Swift 中将数组拆分为元素数量始终不同的部分?

ios - GCD : asynchronously wait for condition

http - Flickr API iOS 应用程序 "POST size too large!"