Свифт продвигает несколько задач?

У меня есть этот ярлык, который должен отображать имя пользователя. Сейчас я довольно много занимался разработкой IOS, однако многопоточность для меня все еще немного неясна. Как бы убедиться, что этот код заканчивается:

User(name: "", email: "", _id: "").getCurrentUser(userId: userId)

До того, как это изменится?

self.nameLabel.text = currentUser.name

Я возился с DispatchQueue но я не могу понять это... Спасибо заранее!

3 ответа

Решение

Просто отправьте уведомление в свой getCurrentUser() метод и добавьте наблюдателя в свой UIViewController для обновления метки.

public extension Notification.Name {
    static let userLoaded = Notification.Name("NameSpace.userLoaded")
}

let notification = Notification(name: .userLoaded, object: user, userInfo: nil)
NotificationCenter.default.post(notification)

И в вашем UIViewController:

NotificationCenter.default.addObserver(
        self,
        selector: #selector(self.showUser(_:)),
        name: .userLoaded,
        object: nil)

func showUser(_ notification: NSNotification) {
    guard let user = notification.object as? User,
        notification.name == .userLoaded else {
            return
    }
    currentUser = user
    DispatchQueue.main.async {
        self.nameLabel.text = self.currentUser.name
    }
}

Вы можете использовать DispatchGroups, чтобы сделать это, как одно решение. Вот пример:

// create a dispatch group
let group = DispatchGroup()

// go "into that group" starting it
group.enter()

// setup what happens when the group is done
group.notify(queue: .main) {
    self.nameLabel.text = currentUser.name
}

// go to the async main queue and do primatry work.
DispatchQueue.main.async {
    User(name: "", email: "", _id: "").getCurrentUser(userId: userId)
    group.leave()
}

Вы должны отличать синхронные задачи от асинхронных. Обычно синхронная задача - это задача, блокирующая выполнение программы. Следующая задача не будет выполнена, пока не закончится предыдущая. Асинхронная задача противоположна. После запуска выполнение переходит к следующей инструкции, и вы обычно получаете результаты этой задачи с делегированием или блоками.

Таким образом, без дополнительных указаний, мы не можем знать, что именно getCurrentUser(:) делать...

По словам Apple:

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

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

Другие вопросы по тегам