2016-04-01 15 views
0

私はクラスを使用してデータを取り込むUICollectionViewを持っています。現時点では、以下のコードに示すように、ダミーデータを入力しています。このダミーデータをFirebaseデータベースのデータで置き換えようとしています。クラスを使用してfirebaseデータを返す方法は?

import UIKit 

class MrNobody 
{ 
// MARK: - Public API 
var title = "" 
var description = "" 
var numberOfMembers = 0 
var numberOfPosts = 0 
var featuredImage: UIImage! 

init(title: String, description: String, featuredImage: UIImage!) 
{ 
    self.title = title 
    self.description = description 
    self.featuredImage = featuredImage 
    numberOfMembers = 1 
    numberOfPosts = 1 
} 

// MARK: - Private 
// dummy data 
static func createMrNobody() -> [MrNobody] 
{ 
    return [ 
     MrNobody(title: "some text" , description: "some text", featuredImage: UIImage(named: "r1")!), 
     MrNobody(title: "some text" , description: "some text", featuredImage: UIImage(named: "r1")!), 
     MrNobody(title: "some text" , description: "some text", featuredImage: UIImage(named: "r1")!), 

    ] 
} 
} 

データを含めるために、私はlet ref = Firebase(url: "my app url")を使用して、私のfirebaseデータベースを識別し

ref.observeEventType(.Value, withBlock: { snapshot in 
print(snapshot.value) 
}, withCancelBlock: { error in 
print(error.description) 
}) 

を使用してデータを読み込み、import Firebaseが含まれていた私は子供のデータを読み取ることができるが、私はできないのです機能のブロックreturnで使用することができます。理想的には、私はenumerator = snapshot.childrenCountを使用して、関心のあるノードに多くの子供がいる場合にはreturn関数を繰り返し使用したいと考えています。

お手伝い、ご指摘いただけると幸いです。

+0

ちょっとOP、私はあなたの質問がすでに答えられていることを知っていますが、私は単にあなたに 'MrNobody'クラスth atは 'FDataSnapshot'を取ります。これはコード内の複数の場所でそれらのスナップショットを使用する必要がある場合(おそらく、 '.ChildAdded'と' .ChildRemoved'イベントタイプを聴いている場合)にコード再利用を可能にするためです。 –

答えて

1

createMrNobody()関数呼び出しは同期型で、Firebaseからデータを取得するときと同じように動作しません。

Firebaseは本質的に非同期なので、データを要求するときは、処理する前にそのデータが取得されるまで待つ必要があります。それ以外の場合、Firebaseがデータを準備する前に処理コードが実行されます。

これは、プロセス全体が同期している関数呼び出しのSQLクエリとは異なります。

これが役立つかどうかわかりませんが、サンプルがあります。人々を格納している配列があり、Firebaseからそれを設定する必要があるとします。あなたがFirebaseからそれらをロードする準備ができているとき

我々は最初の人クラス

class Person { 
     var title: NSString? 
     var aDescription: NSString? 
    } 

と人々に

var myArray = [Person]() 

とを格納する配列を定義し、これはそれを

func loadMyPeople() { 

    myUsersRef.observeSingleEventOfType(.Value, withBlock: { snapshot in 

     for child in snapshot.children { 
      let title = child.value["title"] as! String 
      let description = child.value["description"] as! String 
      let dude = Person() 
      dude.title = title 
      dude.aDescription = description 
      self.myArray.append(dude) 
     } 

     //after all your people are loaded in the array, print it's contents 
     // you could also reload a tableView here as well. 
     for dude in self.myArray { 
      print("email: \(dude.title!) desc: \(dude.description!)") 
     } 
    }) 
} 
を行います
+0

ありがとうございます。このレシピを使用して、FirebaseデータベースからTableViewにデータを読み込むことができました。完全性のために、クラスファイルで 'title:NSString、description:NSString'を' title = ""、description = "" 'に変更しなければなりませんでした。さもなければ、私は '' lldb:Unlappingオプションなし ''エラーが発生しました。 – KuboAndTwoStrings

+0

@AtlasShrugged私はSwift 2を使用していますが、そのエラーを受け取っていません - おそらく私のコードごとのオプションで定義する必要がありますので、プロパティのいずれかがnilのときにエラーが発生します。私のPersonクラスはNSObjectのサブクラスであり、すでに 'description'というプロパティを持っているので、矛盾していることに注意してください。私は自分の答えを更新し、説明をaDescriptionに変更しました。私は私の答えが助けてくれてうれしい! – Jay

関連する問題