Swift - 调度队列和串行运行的 U/I

标签 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()
    }
}

最佳答案

与其使用一堆信号量手动序列化闭包,不如使用自定义串行队列。对于动画,用户 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()
    }
    // ...
}

关于Swift - 调度队列和串行运行的 U/I,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56473699/

相关文章:

swift - 内联 if 语句在 void 返回闭包中改变 inout 参数,奇怪的错误(错误 : type 'Int1' does not conform to protocol 'BooleanType' )

c - 尝试学习如何在受控循环中用 C 实现信号量

c - 如何在 C 中的 fork 进程上使用 POSIX 信号量?

swift - 有没有一种特定的方法可以将 DispatchWorkItems 附加到 DispatchQueue 而不是在代码中重新声明它们?

ios - Swift 中的单例类和多个异步操作

swift - 将距离测量格式设置为公里或英制英里,而不是公制英里

java - 使用信号量进行虚假唤醒

ios - 使用闭包时如何防止时序问题?

ios - 多线程在swift ios中并行执行多个任务

ios - 使用委托(delegate)/协议(protocol)将数据传递给第三方 View Controller