由于 swift 中的 for 循环而无法修改数组?
Posted
技术标签:
【中文标题】由于 swift 中的 for 循环而无法修改数组?【英文标题】:Can't modify array because of for loop in swift? 【发布时间】:2017-08-11 04:57:08 【问题描述】:我整天都在为此苦苦挣扎,这似乎没有任何意义,因为我有非常相似的代码可以正常工作。我已经尝试了所有方法,我尝试过创建一个单独的方法来返回一个字符串数组,但都没有奏效。每次在括号外访问时,postIDs 数组都设置为 null,后跟括号(在读取“print(self.postIDs)”的行之后)。感谢您能给我的任何帮助。
var postIDs = [String]()
override func viewDidLoad()
super.viewDidLoad()
tableView.dataSource = self
tableView.delegate = self
let ref = Database.database().reference()
let uid = Auth.auth().currentUser!.uid
ref.child("users").child(uid).child("saved").observeSingleEvent(of: .value, with: snapshot in
var ids = [String]()
let saved = snapshot.value as! [String:AnyObject]
for (elem, _) in saved
ids.append(elem)
self.postIDs = ids
print(self.postIDs) // returns the values I would expect
)
ref.removeAllObservers()
guard self.postIDs.count >= 1 else return // postIDs count is equal to 0 here, and when I print postIDs the result is []
【问题讨论】:
原因是observeSingleEvent
中的代码块与函数的其余部分不在同一个线程中。其余的在主线程中,而observeSingleEvent
在后台运行。它们是异步的。数据加载完成后需要获取postIDs
。
获得预期值的语句位于闭包内。这会导致关闭块的延迟执行。您可以尝试检查是否可以实现完成处理程序,或者您应该在闭包内部使用数组来执行所需的操作。
在observeSingleEvent
块的内部和外部放置断点,你会看到不同。
【参考方案1】:
因为
ref.child("users").child(uid).child("saved").observeSingleEvent(of: .value, with: snapshot in
var ids = [String]()
let saved = snapshot.value as! [String:AnyObject]
for (elem, _) in saved
ids.append(elem)
self.postIDs = ids
print(self.postIDs) // returns the values I would expect
)
在回调到来之前在后台和其他代码行执行
【讨论】:
【参考方案2】:检查以下代码
override func viewDidLoad()
super.viewDidLoad()
usersTableView.dataSource = self
usersTableView.delegate = self
// getSnapShot()
let databaseRef = Database.database().reference()
databaseRef.child("Users").observe(.value, with: (snapshot) in
if snapshot.exists()
self.postData = snapshot.value! as! [String : AnyObject]
self.postData.removeValue(forKey: self.appDelegate.KeyValue)
// self.getUserNames(Snapshot: self.postData)
else
print("No users")
print(self.postData) //Does not return nil
self.getSnapShot() //Take snapshot outside paranthesis
)
print(self.postData) //Returns nil
func getSnapShot()
print(self.postData) //Value of Snapshot is printed
【讨论】:
非常感谢您的快速回复,我现在将尝试实施。以上是关于由于 swift 中的 for 循环而无法修改数组?的主要内容,如果未能解决你的问题,请参考以下文章