使用背景代码从swift函数返回值

时间:2015-11-28 06:16:33

标签: xcode swift parse-platform

下面的函数只返回false,可能是因为 user.singUpInBackgroundWithBlock 在后台发生。

无论如何我能从函数中获得预期的返回值吗?

var returnFlag:Bool = false

func signUpAction(email:String, password:String) -> Bool
{
        let user = PFUser()
        user.username = email
        user.password = password

        user.signUpInBackgroundWithBlock {
            (succeeded: Bool, error: NSError?) -> Void in
            if let error = error {
                let errorString = error.userInfo["error"] as? NSString
                print(errorString!)
                // INTENDED RETURN
                self.returnFlag = false
            } else {
                // INTENDED RETURN                    
                self.returnFlag = true 
            }
        }
        return self.returnFlag
}

1 个答案:

答案 0 :(得分:0)

你是对的,该函数将返回false,因为可能没有在主线程上调用该块。

这是使用NSNotification的理想方案。不要传递返回值,而是在登录操作完成后发布通知。

示例代码:

在视图控制器生命周期的早期某个地方,最好是viewdidload。将您的类注册到观察者以获取登录成功和登录失败通知。

NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("LoginFailedFunc:"), name: "loginFailed", object: nil)

NSNotificationCenter.defaultCenter()。addObserver(self,selector:Selector(" loginSuccessFunc:"),name:" loginSuccess",object:nil)

在登录功能中,根据有效或无效登录信息发布通知。

func signUpAction(email:String, password:String){

let user = PFUser()
user.username = email
user.password = password

user.signUpInBackgroundWithBlock {
    (succeeded: Bool, error: NSError?) -> Void in
    if let error = error {
        let errorString = error.userInfo["error"] as? NSString
        print(errorString!)
        // INTENDED RETURN
        NSNotificationCenter.defaultCenter().postNotificationName("loginFailed", object: self)
        self.returnFlag = false
    } else {
        NSNotificationCenter.defaultCenter().postNotificationName("loginSuccess", object: self)
        self.returnFlag = true
    }
  }
}

最后记得在不再需要时停止观察通知。