Saya ingin agar dalam loop untuk mengirim sekelompok permintaan jaringan ke firebase, kemudian meneruskan data ke pengontrol tampilan baru setelah metode selesai dijalankan. Ini kode saya:
var datesArray = [String: AnyObject]()
for key in locationsArray {
let ref = Firebase(url: "http://myfirebase.com/" + "\(key.0)")
ref.observeSingleEventOfType(.Value, withBlock: { snapshot in
datesArray["\(key.0)"] = snapshot.value
})
}
// Segue to new view controller here and pass datesArray once it is complete
Saya punya beberapa masalah. Pertama, bagaimana saya menunggu sampai loop selesai dan semua permintaan jaringan selesai? Saya tidak dapat memodifikasi fungsi observSingleEventOfType, ini adalah bagian dari SDK firebase. Juga, akankah saya membuat semacam kondisi balapan dengan mencoba mengakses DateArray dari berbagai iterations for for (harapan yang masuk akal)? Saya sudah membaca tentang GCD dan NSOperation tapi saya agak bingung karena ini adalah aplikasi pertama yang saya buat.
Catatan: Array lokasi adalah array yang berisi kunci yang perlu saya akses di firebase. Juga, penting bahwa permintaan jaringan dimatikan secara tidak sinkron. Saya hanya ingin menunggu sampai SEMUA permintaan asinkron selesai sebelum saya melewatkan DateArray ke pengontrol tampilan berikutnya.
datesArray
menggunakan kunci yang berbeda.Xcode 8.3.1 - Swift 3
Ini adalah jawaban yang diterima dari paulvs, dikonversi ke Swift 3:
sumber
Swift 3 atau 4
Jika Anda tidak peduli dengan pesanan , gunakan jawaban @ paulvs , itu berfungsi dengan baik.
kalau-kalau ada orang yang ingin mendapatkan hasilnya agar bukannya memecat mereka secara bersamaan, berikut adalah kodenya.
sumber
dispatchSemaphore.signal()
sebelum atau setelah meninggalkandispatchGroup
? Anda akan berpikir bahwa yang terbaik untuk membuka blokir semafor selambat mungkin, tetapi saya tidak yakin apakah dan bagaimana meninggalkan grup mengganggu itu. Saya menguji kedua pesanan dan sepertinya tidak ada bedanya.Detail
Larutan
Pemakaian
Sampel lengkap
sumber
Anda perlu menggunakan semaphores untuk tujuan ini.
sumber
Swift 3: Anda juga bisa menggunakan semaphores dengan cara ini. Hasilnya sangat membantu, selain itu Anda dapat melacak kapan dan proses apa yang selesai. Ini telah diekstraksi dari kode saya:
sumber
Kita bisa melakukan ini dengan rekursi. Dapatkan ide dari kode di bawah ini:
sumber
Grup pengiriman baik tetapi urutan permintaan yang dikirim acak.
Dalam kasus proyek saya, setiap permintaan yang perlu diluncurkan adalah urutan yang benar. Jika ini bisa membantu seseorang:
Hubungi:
Hasil:
Lihat info lebih lanjut: Inti
sumber