关闭时更新UI

时间:2015-01-27 19:19:13

标签: multithreading swift closures

我正在尝试在执行具有状态关闭和完成关闭的函数时更新我的​​UI。 UI仅在闭包完成时更新。我知道发生这种情况是因为主线程上没有发生操作,需要在主线程上更新UI。我已经尝试将UI更新移动到主线程,但没有任何运气。我已经包含了我的代码的简化版本。

我该如何解决这个问题?如果我为我的代码指定一个自定义线程,它会解决问题吗?如果是这样,那怎么办?

非常感谢您花时间阅读。

代码包括在下面。如果您需要有关此问题的更多信息,请与我们联系。

func parse(array: [String], status:(status: String!, progress: Float!) -> (), completion:(result: [String]!) ->()) -> () {

        status(status: "Process is starting.", progress: 0)

        var newArray = [String]()

        for (index, txt) in enumerate(array) {

            //Update status
            let progress = Float(index + 1) / Float(array.count)

            status(status: "Checking string: \(txt)", progress: progress)

            //Do something with txt
            let newTxt = txt + "OK"

            newArray.append(newTxt)

        }

        status(status: "Complete!", progress: 1.0)

        //Send completion
        completion(result: newArray)

    }

    var startArray = [String]()

    for index in 0...10000 {

        startArray.append("\(index)")

    }

    parse(startArray, { (status: String!, progress: Float!) -> () in

        dispatch_async(dispatch_get_main_queue(), { () -> Void in

            println(status)
            self.statusLabel.text = status

            println(progress)
            self.progressView.progress = progress

        })

        }, { (result: [String]!) -> () in

            println("Process complete. Here is the result:\n\(result)")
    })

1 个答案:

答案 0 :(得分:0)

我的问题是在主线程上调用了解析,因此在更新UI时,该线程已被阻止。我通过将解析放入另一个线程,然后使用GCD更新主线程上的UI来解决问题(在David的评论的帮助下)。