Parse.com PFUser signUpInBackgroundWithBlock:块在第一次点击时不被调用

我正在开发与Swift和parse.com框架的iOS应用程序,并注册新用户有一个大问题。

虽然新用户正在注册,但是第一次敲击时,“signUpInBackgroundWithBlock”块没有被调用。 当我第二次点击button时,块终于被调用,并且出现错误,用户名已经被注册。

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) } 

是否有人有同样的问题,并知道这种奇怪的行为的解决scheme?

谢谢!

编辑:

完成块应该调用“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() } } } } 

它的调用在第一次,但它需要一点时间来调用这个..因为它发送数据在服务器上的asynchronous。 asynchronous永不阻塞主线程

因为: –

  • asynchronous从不阻塞等待networking响应的主线程。
  • asynchronous可以在单独的线程上同步,也可以在任何线程的运行循环中调度。
  • asynchronous可以在单独的线程上同步,也可以在任何线程的运行循环中调度。
  • 同步块主线程,直到他们完成请求。

因为你调用的方法是asynchronous的,所以需要一些时间来做,而你的主线程不会等待方法结束。 所以如果你想显示一个消息或执行一个循环,注册后,把它放在完成块内:

 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. } } 

另外,如果您不想以asynchronous方式执行此操作,则可以调用signUp()方法(不使用inBackgroundWithBlock 。这样,应用程序将等待注册完成,直到它继续。

我想到了。 问题是,我在AppDelegate中使用了PFUser.enableAutomaticUser()。 我删除了该行,注册块完美无瑕的工作!

我试过以前发布的解决scheme(消除PFUser.enableAutomaticUser() ),问题依然存在。

如果其他人仍然在寻找解决此问题的方法,请尝试在signUpInBackground的块signUpInBackground if error == nil更改为if succeeded == true 。 这为我工作,所有function在后端。