Swift范围规则 - 设置非零值后的nil值

时间:2016-04-12 05:27:25

标签: ios swift swift2 ios9

我正在编写与Firebase接口的DataService。我在一个闭包中设置self.realID,当我在闭包之外引用它时,它会失败,因为它会解开一个nil值。为什么会这样?

我的档案:

import Foundation
import Firebase

class Database {

    var firebaseRef = Firebase(url:"https://<<UNIQUE>>.firebaseio.com")

    class var sharedInstance: Database {
        struct Data {
            static var instance: Database?
            static var token: dispatch_once_t = 0
        }

        dispatch_once(&Data.token) {
            Data.instance = Database()
        }

        return Data.instance!
    }

    var uid : String!

    var realID : String!

    var validated = false

    func validate(user: String, study: String) -> Bool {

        firebaseRef.authUser(user+"@example.com", password: user,
             withCompletionBlock: { error, authData in
                if error != nil {
                    NSLog(String(error))
                } else {
                    self.uid = authData.uid
                    NSLog(authData.uid)
                }
        })

        let usersRef = Firebase(url: "https://<<UNIQUE>>.firebaseio.com/users")
        usersRef.observeEventType(FEventType.Value, withBlock: { (snapshot) in
            let value = snapshot.value.objectForKey("study") as! String
            self.realID = value
            NSLog(self.realID) // this is a non-nil value
        })

        NSLog("About to encounter nil value and crash")
        if self.realID == study {
            return true
        }
        return false
    }
}

如何防止发生此致命错误?

1 个答案:

答案 0 :(得分:5)

您需要添加completionHandler,因为它是异步请求。如果您将设置断点,则在设置ID之前执行return。

func validate(user: String, study: String, completionHandler:(Bool) -> Void) {

    let usersRef = Firebase(url: "https://<<UNIQUE>>.firebaseio.com/users")
    usersRef.observeEventType(FEventType.Value, withBlock: { (snapshot) in
        if let value = snapshot.value.objectForKey("study") as? String {
            self.realID = value
            completionHandler(true)
        } else {
            completionHandler(false)
        }
    })

}

<强>更新

validate("Rahul", study: "Study") { (value: Bool) in
    if value {

    } else {

    }
}