Swift-调度队列和按顺序运行的U / I

时间:2019-06-06 08:31:54

标签: swift semaphore dispatch-queue

我有一个应用程序的辅助LaunchScreenViewController,该应用程序具有一些动画,同时可以收集三种类型的背景数据。

一切正常,但是DispatchQueues.async的运行顺序是随机的。但是,如果我将它们更改为DispatchQueues.sync,则所有操作均会以正确的顺序进行,但运行速度如此之快(即使有睡眠),您也看不到动画。

这需要是.sync,但是如何控制U / I,以便可以看到动画? (此处显示为例如self.subLogo1View.isHidden = true)

代码如下:

// Queuing Variables    
var semaphore    = DispatchSemaphore(value: 1)    
var semaphoreSub = DispatchSemaphore(value: 1)

override func viewDidLoad() {
    super.viewDidLoad()
    DispatchQueue.global().async {
        self.semaphore.wait()
        self.gatherData()
        self.semaphore.signal()
    }

    DispatchQueue.global().async {
        self.semaphore.wait()
        self.checkNetworkAvailability()
        self.semaphore.signal()
    }

    DispatchQueue.global().async {
        self.semaphore.wait()
        self.checkSomething()
        self.semaphore.signal()
    }   
}


func gatherData() {
    DispatchQueue.main.async {
        self.semaphoreSub.wait()
        print ("1")
        self.subLogo1View.isHidden = true
        self.subLogo1View.setNeedsDisplay()
        self.semaphoreSub.signal()
    }
}

func checkNetworkAvailability() {
    DispatchQueue.main.async {
        self.semaphoreSub.wait()
        print ("2")
        self.subLogo2View.isHidden = true
        self.subLogo2View.setNeedsDisplay()    
        self.semaphoreSub.signal()
    }
}

func checkSomething() {
    DispatchQueue.main.async {
        self.semaphoreSub.wait()
        print ("3")
        self.subLogo3View.isHidden = true
        self.subLogo3View.setNeedsDisplay()
        self.semaphoreSub.signal()
    }
}

1 个答案:

答案 0 :(得分:1)

与其使用一串信号量手动序列化闭包,不如使用自定义的 serial 队列。对于动画,用户UIView.animate

类似这样的东西:

func gatherData() {
    DispatchQueue.main.async {  // or sync, depending on your animation needs
        print ("1: gather Data")
        UIView.animate(withDuration: 0.5) { 
            self.subLogo1View.alpha = 0  // instead of isHidden
        }
    }
}

func viewDidLoad() {
    var mySerialQueue = DispatchQueue (label:"my.serial")
    mySerialQueue.async {
        self.gatherData()
    }
    mySerialQueue.async {
        self.checkNetworkAvailability()
    }
    // ...
}