2016-04-01 6 views
0

Verileri bir sınıf kullanarak yerleştirdiğim bir UICollectionView var. Şu andan itibaren, aşağıdaki kodda gösterildiği gibi, sahte verilerle dolduruyorum. Bu sahte verileri Firebase veritabanımdaki verilerle değiştirmeye çalışıyorum.Firebase verilerini bir sınıf kullanarak nasıl iade edebilirim?

verileri dahil etmek için
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")!), 

    ] 
} 
} 

, ben çocuk verilerini okumak mümkün duyuyorum

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

kullanılarak let ref = Firebase(url: "my app url") ve okuma verilerini kullanarak benim Firebase veritabanını tanımlayan, import Firebase dahil ettik ama edememek değilim fonksiyonun return bloğunda kullanmak için. İdeal olarak, enumerator = snapshot.childrenCount'u kullanmak ve yinelemeli olarak return işlevini, ilgili düğümde çok sayıda çocuk için kullanmak istiyorum.

Her türlü yardım/yön takdir edilecektir.

+0

Hey OP, Sorunuzun zaten yanıtlandığını biliyorum, ancak sizi "MrNobody" sınıfında bir başlatıcı yapmanız için teşvik ediyorum bir FDataSnapshot alır. Bu iyi bir uygulamadır çünkü bu anlık görüntüleri kodunuzda birden fazla yerde kullanmanız gerektiğinde kod yeniden kullanılabilirliğine izin verir (belki .Child Added ve '.ChildRemoved' olay türlerini dinlerseniz). –

cevap

1

createMrNobody() işlev çağrısı eşzamanlıdır ve Firebase'den veri aldığınızda aynı şekilde davranmaz.

Firebase doğası gereği eşzamansızdır, bu nedenle verileri istediğinde, işlenmeden önce bu verilerin alınmasını beklemeniz gerekir. Aksi takdirde, Firebase verileri hazır olmadan önce işlem kodu çalışır.

Tüm işlemin senkronize edildiği bir işlev çağrısı SQL sorgusundan farklıdır.

Bunun işe yarayıp yaramayacağından emin değiliz, ancak örnek olarak: İnsanları depolayan bir dizimiz olduğunu ve Firebase'den doldurmamız gerektiğini varsayalım. Eğer Firebase bunları yüklemek için hazır olduklarında

Biz ilk kişi sınıf

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

ve insanlara

var myArray = [Person]() 

ve depolamak için dizi tanımlamak, bu o

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!)") 
     } 
    }) 
} 
yapacak
+0

Teşekkürler. Firebase veritabanından gelen verileri TableView'ma okumak için bu tarifi kullanabildim. Tamlık adına, "NSString, description: NSString' - 'title =" ", description =" "' sınıf dosyasında değiştirmem gerekti. Aksi halde, bir '' lldb: Opsiyonel değil hata yapılırken sıfır bulundu. – KuboAndTwoStrings

+0

@AtlasShrugged Swift 2'yi kullanıyorum ve bu hatayı almıyorum - muhtemelen kodumdaki seçeneklerde tanımlanmalılardı, bu yüzden özelliklerden biri sıfır olduğunda başka bir yerde hata oluşuyor olabilir mi? Kişi sınıfımın zaten bir 'açıklama' özelliği olan bir NSObject alt sınıfı olduğunu ve bu nedenle bir çakışma olduğunu unutmayın. Cevabımı güncelledim ve açıklamayı bir Açıklama olarak değiştirdim. Cevabım yardım ettiğim için mutluyum! – Jay