2016-04-19 4 views
1

У меня есть эта рекурсивная функция, которая ждет, пока изображение не будет загружено. Однако он не работает должным образом. UIImageView никогда не обновляется.Swift: использование ссылочных типов с GCD

(Параметр изображения представляет собой поле типа класса, и загружается с помощью 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) 
+0

Где 'image' должен взялось? – jtbandes

+0

@jtbandes Это поле класса. Я добавил образец вызова, чтобы сделать его более понятным. –

+0

Что вы пытаетесь достичь этой функцией? Может быть, есть более чистые способы, как использование таймера? –

ответ

0

Вместо ссылки на изображения, я верю, что вы хотите ссылку на ссылку на изображение, которое вы можете получить, сделав image и аргумент inout. Так что, может быть что-то вроде:

func waitForImage(inout image: UIImage?, imageName: String, imageView: UIImageView, waitTimeInSec: Double = 0.5, repeatCount: Int = 0)

И называют это нравится:

waitForImage(&item.owner.picture, imageName: "Owner's Avatar, \(item.owner.ID)", imageView: ivAvatar)


Подумав немного больше, альтернативный подход, который бы еще дать общее решение, как вы хотите создать протокол, такой как:

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: "Owner's Avatar, \(item.owner.ID)", imageView: ivAvatar)

+0

Я уже пробовал использовать 'inout' подход, но он не работает. –

Смежные вопросы