2016-05-04 8 views
0

私はソーシャルアプリを作成しています。そのソーシャルアプリの一般的な側面は、ユーザーが投稿した投稿のタブを維持することです。私は、このためのバックエンドとしてFirebaseを使用して、ここで私のスキーマがFirebaseの 'users'の 'posts' referenceを保持できません

SocialApp 
posts 
    -KGsBG5TPYBtzRivZnbf 

    users 
    facebook:10154108240254134 
     cachedProfile 
     displayName: "Karthik Kannan" 
     imageURL: "https://scontent.xx.fbcdn.net/v/t1.0-1/p100x100..." 
     posts 
     -KGsBG5TPYBtzRivZnbf: true 
     provider: "facebook" 

私は先に行くと1台のデバイス(またはシミュレータ)からの投稿を追加すると予定通り、これは動作しますが、ときに私は、デバイスからアプリを削除して再インストールしていますユーザー辞書の投稿関係が消えます。私はそれがデバイス間で存続し、関係を損なわないようにしたいので、ユーザが他のiDeviceを使って自分の投稿を孤立させないようにすることを決めた場合。
Firebaseに投稿を追加するために書いたコードと、現在どのようにユーザーを追跡しているのですか?

func postToFirebase(imgUrl: String) { 
    var gift: Dictionary<String, AnyObject> = [ 
     "giftName": giftName.text!, 
     "giftDescription":giftDescription.text!, 
     "giftAvailableAt": giftAvailableAt.text!, 
     "giftPrice": Int(giftPrice.text!)!, 
     "username": NSUserDefaults.standardUserDefaults().valueForKey("uid")!, 
     "giftImage":imgUrl, 
    ] 

    let firebasePost = DataService.ds.REF_POSTS.childByAutoId() 
    firebasePost.setValue(gift) 

    firebasePost.observeSingleEventOfType(.Value, withBlock: { snapshot in 
     if let postID = snapshot.key { 
      DataService.ds.REF_USER_CURRENT.childByAppendingPath("posts").childByAppendingPath(postID).setValue(true) 
     } 

    }) 
    } 

これは私が現在のユーザー設定する方法である:

var REF_USER_CURRENT:Firebase { 
    if let uid = NSUserDefaults.standardUserDefaults().valueForKey("uid") as? String { 

     let user = Firebase(url:"\(BASE_URL)").childByAppendingPath("users").childByAppendingPath(did){ 
      return user! 
     } else { 
      return Firebase() 
     } 
    } 

    func createFirebaseUser(uid:String, user:Dictionary<String, AnyObject>) { 

     REF_USERS.childByAppendingPath(uid).setValue(user) 
    } 

を、これは私のログインコントローラのコードです。

 NSUserDefaults.standardUserDefaults().setValue(authData.uid, forKey: "uid") 

     let user = ["provider":authData.provider!,"displayName":authData.providerData["displayName"]!,"cachedProfile":authData.providerData["cachedUserProfile"]!, "imageURL":authData.providerData["profileImageURL"]!] 

     DataService.ds.createFirebaseUser(authData.uid, user: user) 

     self.performSegueWithIdentifier("loggedIn", sender: nil) 

これはすべて私が書いたコードです。私はそれがNSUserDefaultsと関係があると考えています。どんな助けもこの初心者から高く評価されます。

+0

Firebaseに投稿を書くとき、Firebaseダッシュボードにログインして、データが実際にそこにあることを確認しましたか?次に、FireBaschの任意のノードにonDisconnectオブザーバーを接続しましたか?最後に、ユーザがログアウトしたり、接続を解除したりすると、Firebaseに何か書き込むことができますか?そして...ログインコントローラでは、既存のユーザを認証するためにcreateFirebaseUserを使用する必要があるのはなぜですか? – Jay

+0

あなたは実際にあなたのユーザーをどこで認証しますか?また、明確にするために、デバイス間でデータが保持されるわけではありません。 Firebaseにデータが存在し、FirebaseはFirebaseデータを監視するデバイス間でデータを有効にして同期化します。 – Jay

+0

ちょっと@Jay、私はダッシュボードにログインし、データの存在を確認しました。ユーザーと投稿の関係は「リセット」されているだけです。そして、私のcreateFirebaseUserはログインコントローラではありませんが、Firebase Data Servicesに使用する別のファイルにあります。 –

答えて

0

コードを確認してください。

のvar REF_USER_CURRENT:私はここにタイプミスを発見した。Firebase { せたuid =のNSUserDefaults.standardUserDefaults(あれば)valueForKey( "UID")のように?文字列{

let user = Firebase(url:"\(BASE_URL)").childByAppendingPath("users").childByAppendingPath(did){ 
     return user! 
    } else { 
     return Firebase() 
    } 
} 
代わりに「... childByAppendingPathは(なかった)」 あなたはそれよりも

他に 『UID』 『やった』に変更する場合がありますの

、私は残りの部分をテストしていませんあなたのコードの。

このアプリを作成するには、Mark Priceコースを視聴したようです。 だから私は持っています:)

関連する問題