gpt4 book ai didi

ios - swift 中后台队列的性能?

转载 作者:搜寻专家 更新时间:2023-10-31 22:09:35 25 4
gpt4 key购买 nike

跟进我的问题 here .

我有一个方法 lotsOfWork() 可能需要一些时间才能完成。当它运行时,用户需要等待它完成。我想向用户提供反馈,以便他(她)看到发生了什么。

我现在有以下代码来运行我的 lotsOfWork() 方法,同时允许它更新显示其进度的标签:

import UIKit

class ViewController: UIViewController {

@IBOutlet weak var label: UILabel!

override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)

DispatchQueue.global(qos: .background).async {
self.lotsOfWork()
}
}

func lotsOfWork() {
for i in 1...10 {
DispatchQueue.main.async {
self.label.text = "Working on item \(i)..."
}
sleep(1) // Simulating lots of work
}
}
}

但这也意味着 lotsOfWork() 方法将在后台队列中执行,而不是在 main 中执行。

当 lotsOfWork() 运行时,主队列中实际上没有发生任何事情——除了更新标签。用户只能等待。

问题 1:这是一个实质性的性能问题吗?这项工作是否需要更多时间才能完成?

问题 2:如果这是一个问题,有没有办法让 lotsOfWork() 方法在 main 中运行,同时仍然能够更新 label.text?

我尝试使用 DispatchQueue.main.async 甚至 2 个嵌套的 DispatchQueue.main.async,但这不会更新 label.text。

我也尝试过使用 setNeedsDisplay() 和 setNeedsLayout(),但这并没有改变任何东西。

在 main 中执行 lotsOfWork() 不会有问题,因为用户需要等待这项工作完成才能继续。但是如果 lotsOfWork() 在 main 中运行,我无法实时更新 label.text。

最佳答案

您请求的 QoS(服务质量)不正确。您已请求背景:

Used for work that is not user initiated or visible. In general, a user is unaware that this work is even happening. For example, pre-fetching content, search indexing, backups, or syncing of data with external systems.

后台任务是优先级最低的任务,原则上可能永远不会执行(至少,您应该愿意接受数小时或更长时间的延迟)。

如果用户请求操作并且必须等待它完成,那么正确的 QoS 是 .userInitiated:

Used for performing work that has been explicitly requested by the user, and for which results must be immediately presented in order to allow for further user interaction. For example, loading an email after a user has selected it in a message list.

此 QoS 级别可以(而且通常)与主队列一样高效,但您通常应该避免二次猜测系统将做什么,并确保您使用与意图相匹配的 QoS 标记操作.所有这一切的最佳介绍是 Concurrent Programming with GCD in Swift 3 .

我通常发现当人们选择.background(最低QoS)时,他们通常意味着.utility,而当他们选择.userInteractive(最高级别),它们通常表示 .userInitiated。最高和最低级别有非常特殊的用例,不会经常出现。如果你需要不到一天的结果,你不是指 .background,如果需要超过 16ms 完成,你不是指 .userInteractive .

关于ios - swift 中后台队列的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53141829/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com