【问题标题】:Swift Scoping Rules -- nil value after setting a non-nil valueSwift 范围规则——设置非零值后的零值
【发布时间】:2016-04-12 05:27:25
【问题描述】:

我正在编写一个与 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
    }
}

如何防止这种致命错误的发生?

【问题讨论】:

    标签: ios swift swift2 ios9


    【解决方案1】:

    您需要添加一个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 {
    
        }
    }
    

    【讨论】:

    • 没错。在异步实现完成后调用闭包。块后的代码不一定会在observeEventType发生后调用
    • 这将如何进入当前代码以实现预期结果?我对 swift 很陌生。
    • 我在上面添加了代码
    • @RahulKatariya 这怎么称呼?编译器抱怨它在调用时缺少完成处理程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    • 2016-10-13
    • 2014-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多