Xcode 线程完成时,Swift 2按钮标签文本更改

Xcode 线程完成时,Swift 2按钮标签文本更改,xcode,multithreading,swift2,nsoperation,dispatch-async,Xcode,Multithreading,Swift2,Nsoperation,Dispatch Async,我正在运行一系列调度,当最后一个调度完成时,我想更改按钮的标签。然而,更改swift与在主线程之外进行UI组件更改不同。有时它是有效的。有时候不是。奇怪的是,如果没有,如果我单击断点图标(不管我是激活所有断点还是禁用断点),标签会立即根据需要更改 @IBAction func runButtonSelected(sender: AnyObject) { runButton.setTitle("Stop Run", forState: UIControlState.Norm

我正在运行一系列调度,当最后一个调度完成时,我想更改按钮的标签。然而,更改swift与在主线程之外进行UI组件更改不同。有时它是有效的。有时候不是。奇怪的是,如果没有,如果我单击断点图标(不管我是激活所有断点还是禁用断点),标签会立即根据需要更改

    @IBAction func runButtonSelected(sender: AnyObject) {
        runButton.setTitle("Stop Run", forState: UIControlState.Normal)
        isRunning = true
        self.run()
    }

请求执行

func execute() {
    let session = NSURLSession.sharedSession()
    let request = NSMutableURLRequest(URL: URL)
    request.HTTPMethod = self.method
    request.HTTPBody = self.params.dataUsingEncoding(NSUTF8StringEncoding)
    self.task = session.dataTaskWithRequest(request) {
        (data, response, error) in
        if error == nil {
            do {
                .
                .
                .
                .                   
                switch self.statusCode {

                case 200:
                    self.contentsOfURL = try NSString(contentsOfURL: self.URL, encoding: NSUTF8StringEncoding)
                case 400:
                    print("400: page not found")

                case 404:
                    print("404: page not found")

                case 407:
                    print("407: failed authenticate proxy credentials")

                default:
                    print("unable to get statusCode")

                }
            } catch {
                print(error)
            }
            self.isRequesting = false
        } else {
            print(error)
        }
    }
        self.task.resume()
}

由于您希望您的最终调度在其他调度之后对块执行,请尝试:

void dispatch_async( dispatch_get_main_queue(), dispatch_block_t block);

这将使用与应用程序主线程相关联的串行调度队列,而不是像上一个队列那样在后台运行。

因为您希望在其他调度尝试后对块执行最终调度:

void dispatch_async( dispatch_get_main_queue(), dispatch_block_t block);

这将使用与应用程序主线程关联的串行调度队列,而不是像上一个那样在后台运行。

可以尝试使用
dispatch\u async(dispatch\u get\u main\u queue(),…
用于线程2。@我会成功的!谢谢。如果您将其作为答案提交,我会将其标记为已回答。可能尝试对线程2使用
调度异步(调度获取主队列(),…
。@我会成功的!谢谢。如果您将其作为答案提交,我会将其标记为已回答。