【问题标题】:Return value from swift function with background code使用后台代码从 swift 函数返回值
【发布时间】:2015-11-28 06:16:32
【问题描述】:

下面的函数只返回 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
}

【问题讨论】:

    标签: xcode swift parse-platform


    【解决方案1】:

    你是对的,该函数将返回 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
        }
      }
    }
    

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

    【讨论】:

      猜你喜欢
      • 2011-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-01
      • 1970-01-01
      • 2016-02-15
      • 2017-10-29
      • 2011-10-10
      相关资源
      最近更新 更多