2016-03-27 11 views
1

Daha önce gönderdiğim bir soruda Async işlevleri hakkında yeni bir şeyler öğrendim ve bir tane daha eklemem gerekiyordu. Firebase'in girdilerinin bir listesini okuyorum, bir listesini döndürüyorum ve bunları bir diziye atadım.Async işlevi iyi bir şekilde döner, ancak dizi boşalır

Artık sorun, diziyi arama işlevine döndürdüğümde, dizi şimdi boş ve neden emin değilim.

func getListItems(uid: String, completion: (list: Array<String>?) -> Void) { 
    let ref = Firebase(url: getFirebaseURL() + "/" + uid) 
    var taskList = [String]() 

    ref.observeSingleEventOfType(.Value, withBlock: { snapshot in 
     let enumerator = snapshot.children 
     while let rest = enumerator.nextObject() as? FDataSnapshot { 
      taskList.append(rest.value as! String) 
     } 
     completion(list: taskList) 
    }) 
} 

Ve bu bu işlevi çağırmak ve ben bu öğeleri ekleyebilir böylece yerel bir diziye atamak çalışıyorum nasıl:

Ben Firebase girdileri topluyorum nasıl budur (çalışıyor) bir TableView: Ben print(result) yaparsanız

// Retrieve database items 
let uid = def.valueForKey("uid") as! String 
getListItems(uid) { 
    (result) in 
    self.taskListItems = result! 
    //print(result) // This prints out an array filled with my data 
} 
print(taskListItems) // This prints an empty array 

mükemmel bir dizi tükürür, ama ben kullanmaya çalışıyorum yerel dizi yazdırmak değilken. Ben taskListItems tanımlanmış: var taskListItems = [String]()

Ayrıca çalışmayan .append kullanmayı denedim, bu yüzden neler olup bittiğini gerçekten kaybettim.

+0

Bir yarış durumunuz var. Kapağın içindeki kod ayrı bir iş parçacığı üzerinde gerçekleşiyor. Dizininizi yazdırdığınız zaman, kapatma kodu tamamlanmadı. – ryantxr

+0

Bu, birçok kez Stack Overflow ile ele alındı, bu yüzden lütfen sormadan önce arayın. Bkz., Örneğin, benim cevabım burada: http://stackoverflow.com/a/33699235/341994 – matt

+0

@matt Evet, ** ** async işlevleri hakkında bilgi aldım, açıkçası ben ** öğrenmedim. neden burada soruyorum – dsch

cevap

1

Bunun nedeni, print(taskListItems)'u yaptığınız satırın, bloğunuzda print(result)'dan önce çağrılmasıdır. Bunun nedeni, HTTP isteğinin eşzamansız olması ve bittikten sonra kodun içindeki kodu çalıştırmasıdır (print(taskListItems) çağrıldıktan sonra). Yapmanız gereken, bloğun içindeki sonuçları kullandığınız kodunuzu almaktır.

+0

Teşekkürler! Tüm girdileri görüntülemek için bir tablo görünümü kullanıyorum, bu yüzden birden çok yerden erişilebilmem gerektiğini düşünüyorum. Yaptığım şey sadece masaüstümü güncellemekti ve sonra göründü. – dsch

İlgili konular