由于 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 循环而无法修改数组?的主要内容,如果未能解决你的问题,请参考以下文章

不能用swift在for循环中追加一个数组?

由于 continue 而忽略了数组 for 循环中的基本 else 语句

Swift 3:如何使用 for 循环来循环数组

For/In 循环中的完成处理程序 - swift

如何延迟 For 循环直到声音在 Swift 中播放完毕

For循环用于搜索数组,Swift [重复]