Swift - очереди на отправку и U / I, работающие последовательно - PullRequest
0 голосов
/ 06 июня 2019

У меня есть дополнительный 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 Ответ

1 голос
/ 06 июня 2019

Вместо того, чтобы вручную сериализовать свои замыкания с кучей семафоров, вам, возможно, лучше использовать пользовательскую очередь 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()
    }
    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...