通过DispatchQueue更新图像不一致

时间:2018-02-15 05:09:01

标签: swift swift4

我有一个递归功能,我用来通过使用3张图像模拟化身闪烁。大约40%的时间,没有发生眨眼 - 即 - 图像没有更新。有人能让我知道我做错了什么吗?

func blink( _ state: Int = 0) {
    var st = state
    let dly: Double!
    st = st%3
    switch(st) {
    case 0: dly = 4.0 + (Double)(rand(70)) / 10
    case 1: dly = 0.05
    case 2: dly = 0.1
    default: dly = 2.0
    }
    self.avatarView.image = UIImage(named: self.name!+(String)(st+1))
    self.avatarView.setNeedsDisplay()
    delay(dly) { [unowned self] in
        if !self.blinkOn {return}
        self.blink(st+1)
    }
}

func delay(_ delay:Double, weak closure:@escaping ()->()) {
    print("blink", delay)
    DispatchQueue.main.asyncAfter(
        deadline: DispatchTime.now() + delay, execute: closure
    )
}

func rand(_ num: Int) -> Int {
    return Int(arc4random_uniform(UInt32(num)))
}

1 个答案:

答案 0 :(得分:0)

尝试几件事情,这可能有用。

  1. 首先,确保UIImage(named: self.name!+(String)(st+1))返回正确的图片。
  2. 我已经执行了你的代码,并发现代码工作正常,但是在案例1和案例2延迟时间太小的情况下,所以如果你增加那个延迟,你可以观察到图像正在更新。

    switch(st) {
        case 0: dly = 4.0 + (Double)(rand(70)) / 10
        case 1: dly = 0.3
        case 2: dly = 0.2
        default: dly = 2.0
    }
    
  3. 确保此情况正常。

    if !self.blinkOn {return}