为什么我的应用程序在调用 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。可能这段代码应该在读取文档和更新数组后的监听器调用中。
每当我调用此函数时,我的应用程序都会冻结并且调试控制台中不会打印任何内容。我正在尝试从 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。可能这段代码应该在读取文档和更新数组后的监听器调用中。