为什么我的应用程序在调用 func 时冻结

Why is my app freezing when func is called

每当我调用此函数时,我的应用程序都会冻结并且调试控制台中不会打印任何内容。我正在尝试从 firebase 获取字符串和双精度数,然后将它们粘贴到可识别的结构数组中。有什么想法吗???

如果您对存储该对象有其他想法,我很乐意阅读它。

var count = Int()
var name = Array<String>()
var imageUrl = Array<String>()
var id = Array<String>()
var rating = Array<Double>()
var url = Array<String>()
var keys = 0
db.collection("parties").document(Utilities.code).addSnapshotListener { document, error in
    //check for error
    if error == nil {
        //check if document exists
        print("No error")
        if document != nil && document!.exists {
            print("Document Exists")
            if let array = document!.get("yesName") as? Array<String> {
                count = array.count
                name = array
                print("yesName = \(array)")
                keys += 1
            }
            if let array = document!.get("yesImg") as? Array<String> {
                imageUrl = array
                print("yesImg = \(array)")
                keys += 1
            }
            if let array = document!.get("yesId") as? Array<String> {
                id = array
                print("yesId = \(array)")
                keys += 1
            }
            if let array = document!.get("yesRating") as? Array<Double> {
                rating = array
                print("yesRating = \(array)")
                keys += 1
            }
            if let array = document!.get("yesUrl") as? Array<String> {
                url = array
                print("yesUrl = \(array)")
                keys += 1
            }
        }
    }else {
        print("error = \(error!)")
    }
}
while keys < 6 {
    if name.count > 0 && imageUrl.count > 0 && id.count > 0 && rating.count > 0 && url.count > 0 {
        for _ in 0...count {
            yes.list.append(RestaurantListViewModel(name: name.first!, imageUrl: URL(string: imageUrl.first!)!, id: id.first!, rating: rating.first!, url: url.first!))
            print("combined = \(yes.list.append(RestaurantListViewModel(name: name.first!, imageUrl: URL(string: imageUrl.first!)!, id: id.first!, rating: rating.first!, url: url.first!)))")
            name.removeFirst()
            imageUrl.removeFirst()
            id.removeFirst()
            rating.removeFirst()
            url.removeFirst()
        }
        keys = 6
    }
}

你试过调试 while keys < 6 { 圈子吗?

下一行条件

if name.count > 0 && imageUrl.count > 0 && id.count > 0 && rating.count > 0 && url.count > 0

可以很容易地等于 false 并且你得到无限圆 运行。

此外,我在您的代码中发现了一些逻辑问题:在代码的第一部分中,您设置了必填字段(keys 等于 0 到 6 的范围)。但是在圆 while keys < 6 内的第二部分中,您需要所有 6 个字段,并且希望仅在所有值都具有 count > 0 后退出。您只需要在需要时获取 value.count

快照侦听器将异步执行,这意味着在当前方法完成后的某个时间。因此调用后的代码仅在创建监听器之后执行一次:数组和键中还没有任何内容 == 0。可能这段代码应该在读取文档和更新数组后的监听器调用中。