2016-06-23 5 views
0

withBlockステートメントで外側のオブジェクト値を変更する方法に関する問題があります。Swift withBlockステートメントの外側のオブジェクト値を変更する方法

func finduserbyid(uid: Int) -> User{ 
    var current_user = User() 
    let display_ref = self.users_ref.child(String(uid)) 
    display_ref.observeSingleEventOfType(.Value, withBlock: {(snapshot) in  

     let current_user_dic = snapshot.value as! NSDictionary 
     current_user.uid = current_user_dic["uid"] as! Int 
    }) 
     { (error) in 
      print (error) 
      print(error.localizedDescription) 
     } 
    return current_user 
} 

これは私がfirebaseスナップショットFUNCの外へのuserinfoを引っ張ってみてください機能は次のとおりです。

は、ここに私のコードです。

私は、関数がuser.uidの変更行に実行されたことがわかりました。 返されたオブジェクトのユーザーは常に空です

誰かが間違っている部分を指摘してください。

この質問は1か月前のようにありました。

解決策がまだ見つかりませんでした。

と私は同じ入力と他のviewcontrollersでそれを実行しようとした場合のみ、最初のViewControllerで実行します。この機能は、それは私にエラーがスローされます。

fatal error: unexpectedly found nil while unwrapping an Optional value 

と私のブレークポイントに応じてエラーがでhappendsをこのコード行。

display_ref.observeSingleEventOfType(.Value, withBlock: {(snapshot) in 

これは私が常に機能に気づかなかった

とwithblockコード

{ 

age = 0; 

chats =  (

    0 

); 

"course_enroll" =  (

    "" 

); 

"create_time" = "1466705475370.6"; 

department = ""; 

"display_name" = "HL"; 

"email_address" = "[email protected]"; 

"follow_count" = 0; 

"follow_list" =  (

    0 

); 

"follower_count" = 0; 

"follower_list" =  (

    0 

); 

friendlist =  (

    0 

); 

gender = ""; 

history =  (

    0 

); 

language = ""; 

level = 0; 

phone = 0; 

"rating_point" = 0; 

reputation = 0; 

"signed_events" =  (

    0 

); 

uid = 101; 

}内部のプリントcurrent_user_dic出力であるが、二回ハンドルをErrorに最初strightを実行し、二回目は通過します本体。 私はこのように私のViewControllerでそれを呼ばれる:

override func viewDidAppear(animated: Bool) { 
super.viewDidAppear(animated) 
let user = database.finduserbyid(101) 
print(user.display_name) 
print(user.email_address) 
print("1") 
+0

本当にわかりません。 user.uidの変更は何ですか? – Shubhank

+0

current_user.uid = current_user_dic ["uid"] as!コード –

+0

のこの行は、それはゼロになります。これを理解するために参照してくださいhttp://stackoverflow.com/questions/37639601/how-to-retrieve-objects-from-firebase-by-key-value/376​​39623#37639623 – Shubhank

答えて

0

これはどのようにFirebase作品ではなく、それはそれが何をするかではないとして、「機能」としてFirebaseを活用しようとしないでください。

Firebaseは非同期で、スナップショットがFirebaseから移入される前にcurrent_userが返され、そのデータをcurrent_user変数に割り当てることができます。そのため、スナップショットが返される前に実行されたリターンはゼロになります。

デバイスのローカルコードはインターネットよりも速く実行されるため、データをスナップショットで返すためのコードを記述する必要があります。

Firebaseの呼び出しから値を返すことはできません。Firebaseがあなたのために大げさな仕事をすることはできません。

var currentUserName = String() 
let thisUserRef = usersRef.childByAppendingValue("some_uid") 
thisUserRef.observeSingleEventOfType(.Value, withBlock: { snapshot in 
    let self.currentUserName = snapshot.value 
}) 

この例では、Firebaseが値を収集してスナップショットに戻したときにcurrentUserNameが設定されます。これは、コードブロック{}が実行されるときにのみ有効です。あなたがブロックの外側VARを定義した場合、それは自己とそれを参照するとよいでしょう。だから、ブロック内で、あなたが最初の質問に答えるために、返されるデータ

{ snapshot in 
     let self.currentUserName = snapshot.value as! String 
     or 
     self.myTextField.StringValue = snapshot.value as! String 
     or 
     self.myNameArray.append(snapshot.value) 
}) 

で動作するように自由である、というの拡大

*あなたはちょっとしたデータを返すことができますが、実際にそれがどのように設計されているのか、この答えの範囲外です。

+0

ありがとうございました。私はコンセプトを得たので、ブロック{}内のコードは外側のコードより速く実行できないため、修正されません。しかし、私はバックエンドのコードとviewcontrollerをその方法で分離しようとしています。ファイヤーベースコードの大きな塊を何度もコピーするのではなく、関数を複数回呼び出すことができます。どうやってやるの ?いくつかのユーザーのIDを渡して、ユーザーオブジェクトを出したいのですか? –

+0

あなたの考えを変えてください。たとえば、いくつかのユーザー情報を取得し、それをView Controllerに表示したいとします。そのデータのfirebaseを照会し、ブロック内でviewControllerを作成して表示します。あなたが困ってしまうような機能として、ファイヤーベースを考えないでください。値を返さず、何らかのリターンを行うメソッドがありません。 Firebaseからのデータはブロック内でのみ実行可能であり、そのブロックが実行されるまではデータで何もしないでください。 – Jay

+0

ああ - 簡単な例。ビューコントローラにあるtableViewを生成する:シーケンスは次のようになります:viewControllerを表示します(tableviewとともに)。データのfirebaseを照会する。 INSIDE THE BLOCKでは、そのデータをスナップショットから配列に割り当ててtableViewデータソースにします。配列を完全に埋め込み、次にtableView.reloadDataを呼び出します。すべてfirebaseブロック内で完了 – Jay

関連する問題