arrays - 异步 Swift 调用数组

标签 arrays swift asynchronous firebase firebase-realtime-database

目前我正在尝试将值从 firebase 推送到注释对象数组中 唯一的问题是由于 Firebase 的异步特性,我无法让主线程等待获取函数完成。我在这个网站上查看了许多答案,并且阅读了信号量和调度队列文档,但是我无法让此获取工作。看来这里的大多数人都在尝试使用 TableView ,而我却没有。

这是获取代码

func fetchUser(){


FIRDatabase.database().reference().child("notes").observe(.childAdded, with: { (snapshot) in
        if let dictionary = snapshot.value as? [String: AnyObject] {
            let user = noteClass(dictionary: dictionary)
            self.coordinotes.append(user)
        }
    }, withCancel: nil)
} 

我已经删除了所有信号量和调度主要尝试,因为它们都不起作用。在我看来这个函数被称为确实加载。当我检查数组的值并将它们插入“坐标”时,该值尚未放入,并且出现越界错误。

其余代码

import UIKit
import MapKit
import CoreLocation
import Firebase
import FirebaseDatabase

struct PreferencesKeys{
    static let savedItems = "savedItems"
}




class ViewController: UIViewController, CLLocationManagerDelegate{

    let manager = CLLocationManager()
    var coordinotes:[noteClass] = Array()
    var latitude = Double()
    var noteTime = noteBrain()

    //Map
    @IBOutlet weak var map: MKMapView!


    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
    {
        let location = locations[0]
        let myLocation:CLLocationCoordinate2D = CLLocationCoordinate2DMake(location.coordinate.latitude, location.coordinate.longitude)
        let region:MKCoordinateRegion = MKCoordinateRegionMake(myLocation, noteTime.span)
        map.setRegion(region, animated: true)
        self.map.showsUserLocation = true
    }


    override func viewDidLoad()
    {
        super.viewDidLoad()
        navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Logout", style: .plain, target: self, action: #selector(handleLogout))

        if FIRAuth.auth()?.currentUser?.uid == nil {
            perform(#selector(handleLogout), with: nil, afterDelay: 0)
        }
        manager.delegate = self
        manager.desiredAccuracy = kCLLocationAccuracyBest
        manager.requestWhenInUseAuthorization()
        manager.startUpdatingLocation()
        fetchUser()
        loadAllCoordinotes()
    }

    func handleLogout() {

        do {
            try FIRAuth.auth()?.signOut()
        } catch let logoutError {
            print(logoutError)
        }

        let loginController = LoginController()
        present(loginController, animated: true, completion: nil)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }


func loadAllCoordinotes() {
    let length = coordinotes.count - 1
    map.addAnnotation(coordinotes[length])
}

最佳答案

func fetchUser(_ completion:@escaping ([noteClass] , _ success: Bool)-> Void){
    let coordinotes = [noteClass]() 

FIRDatabase.database().reference().child("notes").observe(.childAdded, with: { (snapshot) in
        if let dictionary = snapshot.value as? [String: AnyObject] {
            let user = noteClass(dictionary: dictionary)
            coordinotes.append(user)
        }
        completion(coordinotes, true)
    }, withCancel: nil)

}

然后你在viewDidLoad中调用它,如下所示:

  fetchUser { (coordinotes, success) in
            if success {
                self.coordinotes = coordinote
                self.loadAllCoordinotes()
            }
        }

关于arrays - 异步 Swift 调用数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43461515/

相关文章:

swift - Swift 中 UITextfield 字符数限制

java - 向 Netty HTTP 服务器发送 ajax 请求

java - 将字节流转换为字节数组,无需额外空间

php - 如何在单个数组中获取两个数组而不丢失 mysql 和 php 中的值?

ios - 带有详细信息的静态表格单元格

c# - 使用 TPL/async await 的递归异步调用

javascript - 条件中可能的异步调用

java - 在数组中按姓氏搜索

javascript - 来自函数的意外值 - JS

ios - 如何使用UIDocumentBrowserViewController在iCloud上重新打开UIDocument