2016-05-29 2 views
0

私のタイトルよりも明確にすることができたらうれしいです。私はFirebaseServiceクラスを作成しました。ここでは、データの保存と取得のためのすべてのメソッドを作成します。私は他のどのクラスでもfirebaseのリファレンスを作る必要はありません。私は単にこのクラスを参照してそのことを行いたいだけです。これが不可能な場合は、私に知らせてください。私はそれを前に進めません。以下は私のFirebaseServiceクラスが...あるFirebaseデータサービスクラスのchildByAutoId値を別のクラスで取得するように設定する

私はFirebaseServiceクラスから idを取得できるようにしたいと私はポストを保存するとき、それは実際にchildByAutoIdの値(Firebaseでポストのランダムに生成されたID)を使用してい
import UIKit 
import Firebase 

class FirebaseService: NSObject { 

    let ref = FIRDatabase.database().reference() 
    var id = String() 


    func savePost(post:[String:AnyObject]) { 
     let postRef = ref.child("posts").childByAutoId() 
     id = postRef.key 
     postRef.setValue(post) 

    } 



} 

だから私はそれをidというポストの値として保存することができます。しかし、今私がそれを保存するとき、私は全体としてポストのために生成された意図されたランダムなIDを取得しますが、私は "ID"キーでその値を取得しません。

func postPost() { 
    post.id = FirebaseService().id 
    post.textContent = textView.text 
    post.name = "Michael Williams" 
    post.profileImageName = "cool" 
    post.imageContentName = "coffee" 
    post.createdDate = convertCurrentTimeToString() 
    let postArray:[String:AnyObject] = ["name":post.name!, "profileImageName":post.profileImageName!, "textContent":post.textContent!, "imageContentName":post.imageContentName!, "createdDate":post.createdDate!, "id":post.id!] 
    dismissViewControllerAnimated(true) { 
     FirebaseService().savePost(postArray) 
    } 
} 

Firebaseデータベーススキーム:上記と同じランダムに生成されたID:

  • 記事 "ランダムに生成されたIDを"

    • 名: "ジョン・ドウ"

    • ID

    • postText:私はpostPost()機能を実行すると、 "何とか何とか"

繰り返しますが、私はIDの取得していますすべてが空の文字列です。

+0

一般的な経験則では、閉鎖内で「自己」を使用する必要があります。だからself.id = postRef.key – Jay

+0

また、私はここでのロジックは(確実に)動作しないと思う。 postPost()を呼び出すと、post.id = FirebaseService.idが割り当てられますが、実際のsavePostが呼び出される前に*そのIDを生成します。また、なぜあなたは、あなたが今使ったのと同じ値を使って配列に詰め込んだ投稿をするのですか?どうしてですか?["名前": "マイケルウィリアムズ、" profileImageName ":"クール "など – Jay

+0

あなたの質問に答える:はい、あなたは他のクラスの関数を呼び出すことができます。 Constants.swiftという名前のファイルを作成することを推奨し、そのファイルにシングルトンのような関数や構造体などを保持してください。あなたのケースでは、id変数には関心がありますが、あなたの質問からあなたが何をしたいのかは不明です。 – Jay

答えて

-1

私はあなたのコードを誤解していると思います。私の悪い。ここに私の新しい答えがあります。

私はあなたが

postRef.setValue(post) 
+0

IDはどちらかの方法で文字列になります。例えばid = ""と同じように簡単にできます。 OPは、idがNSUUID文字列ではなく、Firebaseから生成された*キー*である必要があり、作成前に別の変数に割り当てられています(私のコメントを参照)。この回答は質問に対処するものではなく、実際にはあらゆる解決策を提供するものでもありません。 – Jay

+0

ジェイ、私は私の答えの先頭に正しく答えました。私はそれをもっと明確にするために、他の無関係の細部を編集します。 –

0

に電話をかける前に、問題がsavePostがFirebaseServiceのid値を設定するものである

post["id"] = postRef.key 

を設定したいと思います。 savePost関数が呼び出される前にidの値を代入しようとし、idにキーの値を代入します。

savePost関数にPostオブジェクトを引数として渡し、その関数のFirebaseにアップロードする形式を設定してみてください。この関数で作成した参照からPost.idを設定することができます。 savePost機能で

func postPost() { 
//remove line assigned post.id 
post.textContent = textView.text 
post.name = "Michael Williams" 
post.profileImageName = "cool" 
post.imageContentName = "coffee" 
post.createdDate = convertCurrentTimeToString() 
//Remove postArray 
dismissViewControllerAnimated(true) { 
    FirebaseService().savePost(post) 
}} 

割り当てpost.id:あなたはそれが完了ブロックを使用して閉鎖している行うことができます

func savePost(post: Post) { 
    let postRefKey = ref.child("posts").childByAutoId() 
    //Get key 
    let postRef = ref.child("posts") 
    //Generate base reference to all posts 
    post.id = postRefKey 
    let postDict = ["postId": post.id, "postName" : post.name] //etc 
    //save post to postsReference using the generate key and then set that keys value to Post Object 
    postRef.child(postRefKey).setValue(postDict) 


} 

もう一つの方法。関数を呼び出すと、それが完了したときにあなたが完了引数にrefKeyまたはPostkeyを割り当てるsavePost機能に

func savePost(post: Post, completion: String -> Void) { 
//savePostFunctionHere 
let key = postRefKey 
completion(key) 
} 

func postPost() { 
//remove line assigned post.id 
post.textContent = textView.text 
post.name = "Michael Williams" 
post.profileImageName = "cool" 
post.imageContentName = "coffee" 
post.createdDate = convertCurrentTimeToString() 
//Remove postArray 
dismissViewControllerAnimated(true) { 
FirebaseService().savePost(post, completion: { postId in 
post.id = postId 
}) 
}} 

あなたが閉鎖に精通していない場合、その後、あなたが戻ってIDを取得し、あなたは、あなたが望むものを何でもできます。この場合、post.idに割り当てます。

この方法は、以前の方法と同じように他のものを保持したい場合は、他の部分をあまり変更しなくても機能するため、これより優れています。

関連する問題