【问题标题】:Can't modify array because of for loop in swift?由于 swift 中的 for 循环而无法修改数组?
【发布时间】: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块的内部和外部放置断点,你会看到不同。

标签: ios swift firebase


【解决方案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
    
        }
    

    【讨论】:

    • 非常感谢您的快速回复,我现在将尝试实施。
    猜你喜欢
    • 2021-11-02
    • 2016-10-02
    • 1970-01-01
    • 2016-04-25
    • 2019-08-07
    • 1970-01-01
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多