Parse.com PFUser signUpInBackgroundWithBlock:第一次点击时没有调用阻止

时间:2015-02-16 11:09:41

标签: ios swift parse-platform

我正在使用Swift和parse.com框架开发iOS-App,并且在注册新用户时遇到了很大的问题。

虽然新用户已注册,但第一次点击时未调用“signUpInBackgroundWithBlock”块。当我再次点击该按钮时,该块最终被调用,我收到一个错误,即用户名已经注册。

var newUser = PFUser()
newUser.username = registerView.nicknameTextField.text.trim()
newUser.email = registerView.emailTextField.text
newUser.password = registerView.passwordTextField.text

newUser.signUpInBackgroundWithBlock {
        (succeeded: Bool, error: NSError!) -> Void in
            self.registerCompletionBlock(succeeded, error: error)
    }

有人遇到同样的问题,并且知道这种奇怪行为的解决方案吗?

谢谢!

编辑:

完成块应调用“registerCompletionBlock()”函数:

func registerCompletionBlock(succeeded: Bool, error: NSError!) {
    if error == nil {
        let subscriptionStoryboard = UIStoryboard(name: "Subscription", bundle: nil)
        let viewcontroller: UIViewController = subscriptionStoryboard.instantiateInitialViewController() as UIViewController
        self.presentViewController(viewcontroller, animated: true, completion: nil)
    } else {
        if let errorString = error.userInfo?["error"] as? NSString {
            println(errorString)
            if error.userInfo?["code"] as Float == 202{
                let alert = UIAlertView(title: "vergeben", message: "name vergeben", delegate: nil, cancelButtonTitle: "abbrechen")
                alert.show()
            }
        }
    }
}

4 个答案:

答案 0 :(得分:1)

我尝试过之前发布的解决方案(取消PFUser.enableAutomaticUser()),问题仍然存在。

如果其他人仍在寻找此问题的解决方案,请尝试将if error == nil更改为if succeeded == true块中的signUpInBackground。这对我有用,所有功能都在后端运行。

答案 1 :(得分:0)

它第一次调用,但它需要一点时间来调用它..因为它在服务器上以异步方式发送数据。异步永远不会阻塞主线程..

因为: -

  • 异步永远不会阻止等待网络响应的主线程。
  • 异步可以在单独的线程上同步,也可以在任何线程的运行循环中进行调度。
  • 异步可以在单独的线程上同步,也可以在任何线程的运行循环中进行调度。
  • 同步会阻止主线程,直到完成请求为止。

答案 2 :(得分:0)

因为您将方法调用为异步,所以需要一些时间来执行它,并且您的主线程不会等待方法完成。因此,如果您想在注册后显示消息或执行segue,请将其放入完成块中:

newUser.signUpInBackgroundWithBlock {
    (succeeded: Bool!, error: NSError!) -> Void in
    if error == nil {
      // Perform a segue, show a message or whatever you want

    } else {
      let errorString = error.userInfo["error"] as NSString
      // Show the errorString somewhere and let the user try again.
    }
  }

此外,如果您不想异步操作,可以调用signUp()方法(不使用inBackgroundWithBlock。这样,应用程序会等待注册完成,直到它继续。

答案 3 :(得分:0)

我明白了。问题是,我在AppDelegate中使用了PFUser.enableAutomaticUser()。我删除了那一行,注册块现在完美无缺!