Ios Swift:更新循环内的标签

Ios Swift:更新循环内的标签,ios,swift,Ios,Swift,我有一个可以运行一段时间的函数。当它运行时,我想在屏幕上提供反馈 问题是label.text没有更新 我怀疑这是因为我需要在后台执行该函数,否则执行将在ViewDidDisplay方法中“暂停”。但是如果我这样做了,我认为背景中的更新也不会更新文本。所以我想我必须再次更新主线程上的label.text 但当我这样做时,会出现运行时错误: import UIKit class ViewController: UIViewController { @IBOutlet weak var l

我有一个可以运行一段时间的函数。当它运行时,我想在屏幕上提供反馈

问题是label.text没有更新

我怀疑这是因为我需要在后台执行该函数,否则执行将在ViewDidDisplay方法中“暂停”。但是如果我这样做了,我认为背景中的更新也不会更新文本。所以我想我必须再次更新主线程上的label.text

但当我这样做时,会出现运行时错误:

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var label: UILabel!

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

        DispatchQueue.main.async {
            for i in 1...10 {
                DispatchQueue.main.sync {
                    self.label.text = "Working on item \(i)..."
                }
                sleep(1)
            }
        }
    }
}

我看了一下,但这些方法似乎过时了,在Xcode 10/Swift 4中不起作用。

我对后台队列进行了一些研究,发现

在我的示例中使用此选项-此选项有效:

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var label: UILabel!

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

        DispatchQueue.global(qos: .background).async {
            for i in 1...10 {
                DispatchQueue.main.async {
                    self.label.text = "Working on item \(i)..."
                }
                sleep(1)
            }
        }
    }
}

我对后台队列做了一些研究,发现

在我的示例中使用此选项-此选项有效:

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var label: UILabel!

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

        DispatchQueue.global(qos: .background).async {
            for i in 1...10 {
                DispatchQueue.main.async {
                    self.label.text = "Working on item \(i)..."
                }
                sleep(1)
            }
        }
    }
}

问题是在主线程中运行for循环。这意味着一个渲染帧将执行整个for循环

您应该仅在后台线程上运行长任务,并在主线程中更新必要的UI元素:

  DispatchQueue.global(qos: .background).async {// global() will use a background thread rather than the main thread
            for i in 1...10 {
                DispatchQueue.main.sync {
                    self.label.text = "Working on item \(i)..."
                }
                sleep(1)
            }
        }

问题是在主线程中运行for循环。这意味着一个渲染帧将执行整个for循环

您应该仅在后台线程上运行长任务,并在主线程中更新必要的UI元素:

  DispatchQueue.global(qos: .background).async {// global() will use a background thread rather than the main thread
            for i in 1...10 {
                DispatchQueue.main.sync {
                    self.label.text = "Working on item \(i)..."
                }
                sleep(1)
            }
        }

您会遇到什么运行时错误?我会尝试丢失第一个
DispatchQueue
块,并使内部的
.async
您会遇到什么运行时错误?我会尝试丢失第一个
DispatchQueue
块,并使内部的
.async