ios - POST 请求响应后启动 segue

标签 ios swift

我正在向后端发送 POST 请求,并在启动到下一个 View Controller 的 segue 之前等待响应。执行此操作的最佳方法是什么 - 带有完成处理程序的异步 block ?如果 POST 请求返回某个值,则应用程序应跳转到下一个 View Controller ,如果响应是错误,则不应发生任何跳转。

@IBAction func finishPressed(sender: AnyObject) {

        if self.emailField.text != "" && self.usernameField.text != "" && self.passwordField.text != ""
        {
            var dict = ["email": emailField.text, "username": usernameField.text, "password_hash": passwordField.text]

            self.register2(dict, completion: { (result) -> Void in

                if (result == true)
                {
                    self.performSegueWithIdentifier("homeView", sender: nil)

                }
                else
                {
                    print("can't segue")
                }

            })

        }

func register(params: Dictionary<String, String!>, completion: (result:Bool) -> Void))
{
    //Request set up and configuration

    var json = NSJSONSerialization.JSONObjectWithData(data!, options: .MutableLeaves, error: &err) as? NSDictionary

        if(err != nil)
        {
            print(err!.localizedDescription)
            let jsonStr = NSString(data: data!, encoding: NSUTF8StringEncoding)
                print("Error could not parse JSON: '\(jsonStr)'")
                completion(result: true)

        }
        else {
            if let parseJSON = json {
                var success = parseJSON["success"] as? Int
                var usernameError = parseJSON["usernameError"] as? String
                var emailError = parseJSON["emailError"] as? String
                if success == 1
                {
                    print("we have Success: \(success)")
                    completion(result: true)

                }
                else 
                {
                    print("we have Failure: \(success)")
                    completion(result: false)

                }
            else {
                let jsonStr = NSString(data: data!, encoding: NSUTF8StringEncoding)
                print("Error could not parse JSON: \(jsonStr)")
                completion(result: false)

            }
        }
    })

    task.resume()


}

编辑:我在代码中添加了一个完成处理程序,但在尝试继续时崩溃了

*** Assertion failure in -[UIKeyboardTaskQueue waitUntilAllTasksAreFinished]

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[UIKeyboardTaskQueue waitUntilAllTasksAreFinished] may only be called from the main thread.'

最佳答案

看起来完成处理程序是从非主线程的线程调用的。要确保完成处理程序在主线程上执行,请将对完成处理程序的调用包装在在主线程上执行的 gcd block 内:

dispatch_async(dispatch_get_main_queue()) {
    completion(result:true)
}

关于ios - POST 请求响应后启动 segue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32127973/

相关文章:

ios - 使 swift 协议(protocol)符合 Hashable

ios - 无法在我的项目中导入 payfort 库

ios - 如何让 Raspberry Pi 3 可被 iOS 和 CoreBluetooth 发现?

objective-c - autorelease 是否隐藏了 Instruments 中的泄漏?

php - 如何使用 NSURLConnection 获得 PHP 回显?

ios - 将数据保存到 Swift 中的一对多 CoreData 关系中

ios - 将数据从类传递到 WatchOS 2(连接性)

ios - 如何使用 AFNetworking 3.0 发送批量请求

swift - 从核心数据中保存 CKAsset

ios - Swift:在动画播放时更改标签文本值