2016-12-07 8 views
1

私はしばらくの間、この関数によって返された値をviewDidLoadの変数に代入するのに苦労していますが、空の文字列を返しています。 getUid() - firebaseのuidを返しています prRef - ユーザー用のfirebaseテーブルを呼び出していますSwift 3の文字列関数の外に変数を代入する

私は間違っていることを誰かに教えてもらえますか?事前に

おかげで、

var currentWorkplaceId: String? 

func getCurrentWorkplaceId() -> String { 

    //completion:@escaping (Bool)->Void 
    var workplaceid = String() 
    prRef.child(getUid()) 
     .child("workplace_id") 
     .observeSingleEvent(of: .value, with: { snapshot in 
      workplaceid = snapshot.value as! String 
    }) 
    return workplaceid 
} 

用法:

currentWorkplaceId = getCurrentWorkplaceId() 
+0

その同期の混合物(observesingleeventは非同期である)、非同期(getCurrentWorkpaceId()同期しています)。そういうものを混ぜ合わせることはできません。 closureがworkplaceidに値を代入する前に* returnステートメントが実行されているため、これは機能しません。 observeSingleEventがその値をgetCurrentWorkplaceId – Gruntcakes

答えて

1

observeSingleEventはおそらく、コールバックとは非同期です。だから帰ってきたときにworkplaceidはまだ割り当てられていません。自分のコールバックで同じことをする必要があります。

func getCurrentWorkplaceId(_ completion: @escaping (_ workplaceId: String)->()) { 

    //completion:@escaping (Bool)->Void 
    prRef.child(getUid()) 
    .child("workplace_id") 
    .observeSingleEvent(of: .value, with: { snapshot in 
     completion(snapshot.value as! String) 
    }) 
} 

使用:

getCurrentWorkplaceId() { workplaceId in 
    self.currentWorkplaceId = workplaceId 
} 
+0

に渡すのと同じように、getCurrentWorkplaceId()を変更してworkplaceidの値をクロージャを介して呼び出し元に渡します。ありがとうフランキー!それは魅力のように働いた。 – Rob

関連する問題