Функция возврата из фонового потока - PullRequest
0 голосов
/ 05 октября 2018

Выполнение моей функции занимает время

    func hasValidValues() -> Bool{
        let leftValue = Double(leftTextValue) ?? 0
        let rightValue = Double(rightTextValue) ?? 0
        switch self.stackViewType {
            let leftValid = self.hasValidValue(min: targetMin, max: targetMax, value: CGFloat(leftValue), unitConversation: true)
            let rightValid = self.hasValidValue(min: 0, max: plusMinusLimit, value: CGFloat(rightValue), unitConversation: true)
            return leftValid && rightValid
}

Теперь мне нужно выполнить это в фоновом потоке, и я хотел вернуться, чтобы поток пользовательского интерфейса мог получить к нему доступ, и я мог изменить пользовательский интерфейс в другом контроллере.

Может ли кто-нибудь помочь мне в этом?

Ответы [ 3 ]

0 голосов
/ 05 октября 2018

Использование DispatchQueue:

DispatchQueue.global().async {
    let result = self.hasValidChanges()
    DispatchQueue.main.async {
        // Use result
    }
}
0 голосов
/ 05 октября 2018

Вы не можете вернуть значение из другого шага, потому что каждый поток имеет свой собственный стек.Так что вы должны использовать обратный вызов здесь.

func checkValidValues(completionHandler: @escaping ((Bool) -> Void)) {
    DispatchQueue.global().async { [unowned self] in
        let result = self.hasValidChanges()
        DispatchQueue.main.async {
        completionHandler(result)
    }
}
0 голосов
/ 05 октября 2018

Вы можете использовать группу рассылки

var b: Bool = false
let queue = DispatchQueue(label: "myQueue")

let group = DispatchGroup()
group.enter()

DispatchQueue.global().async {
    b = hasValidValues()
    group.leave()
}

group.notify(queue: queue) {
    //use b
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...