2016-04-12 7 views
0

私はFirebaseとインターフェースするDataServiceを書いています。私はクロージャ内にself.realIDを設定しています。クロージャの外側で参照すると、ゼロ値をアンラップするので失敗します。なぜこうなった?Swift Scoping Rules - 非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 
    } 
} 

私が起きてから、この致命的なエラーを防ぐにはどうすればよいですか?

答えて

5

async要求であるため、completionHandlerを追加する必要があります。ブレークポイントを設定する場合は、idを設定する前にリターンが実行されます。正しい

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

} 

UPDATE

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

    } else { 

    } 
} 
+0

。クロージャは、非同期実装が完了した後に呼び出されます。 'observeEventType'が発生した後に、ブロックの後のコードが必ずしも呼び出されるわけではありません。 – lostInTransit

+0

希望の結果を得るには、どのようにして現在のコードに正確に入りますか?私は非常に迅速です。 – bdeo

+0

私は上記のコードを追加しました –

関連する問題