1

我有这个应该显示用户名的标签。现在,我已经做了相当多的 IOS 开发,但是线程对我来说仍然有点不清楚。我将如何确保此代码完成:

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

在执行此操作之前?:

self.nameLabel.text = currentUser.name

我一直在摸索,DispatchQueue但我似乎无法弄清楚......提前谢谢!

4

3 回答 3

1

作为一种解决方案,您可以使用 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()
}
于 2017-10-16T20:09:31.643 回答
0

您必须区分同步任务和异步任务。通常,同步任务是阻止程序执行的任务。直到前一个任务完成,下一个任务才会执行。异步任务则相反。一旦它开始,执行将传递到下一条指令,您通常会通过委托或块从该任务中获得结果。

因此,如果没有更多指示,我们无法知道具体是getCurrentUser(:)做什么的...

根据苹果:

DispatchQueue 管理工作项的执行。提交到队列的每个工作项都在系统管理的线程池上进行处理。

它不一定在后台线程上执行工作项。它只是一种结构,允许您在队列(可能是主队列或另一个队列)上同步或异步执行工作项。

于 2017-10-16T19:55:20.997 回答
0

只需在您的方法中发送一个通知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
    }
}
于 2017-10-16T21:56:04.100 回答