【问题标题】:Accessing Array outside of the loop [duplicate]在循环外访问数组[重复]
【发布时间】:2020-06-07 05:53:15
【问题描述】:

我有一个数组,其中存储了一些不同的用户 ID。 每个 UserID 都与 Firestore 中的相应数据相关联。 所以现在我想从 UserID 中获取所有 JSON 数据,并让它们可以在以后解码。 因此,从每个用户获取的数据(以字典形式出现)必须可以单独访问。 我用这种方式尝试过:

var fetchedIDs = ["ID1", "ID2", "ID3"]
var finalArray = [[String: Any]]()

for id in fetchedIDs{  
                let docRef = Firestore.firestore().collection("Data").document(id)
                docRef.getDocument { (document, error) in
                    if let document = document, document.exists {
                       let myDict: [String: Any] = document.data() as! [String: Any] 
                        finalArray.append(myDict)
                    }    
                }     
            }   
        }

但问题是 finalArray(如 finalArray[0])只能在 For-Loop 中访问。 它应该可以在循环之外访问,如下所示:
finalArray[0] 应该有来自 ID1 的字典数据
finalArray[1] 应该有来自 ID1 的字典数据ID2
也许我想为此复杂化.. 有人可以帮帮我吗?

是否有一个很好的资源来学习范围以及在那种情况下应该如何访问数据? 谢谢!

【问题讨论】:

  • 您确定这不是异步问题,并且您在下载数据之前尝试访问它吗?
  • "Swift + Closure + Async" 应该是一种很好的搜索方式。在 finalArray.append(myDict) 中进行打印,在 for 循环之后进行打印。哪个会先打印?
  • @Larme for 循环后的打印是第一个打印的。
  • 我知道。这是为了指出你的代码的异步性。就像我说的 « Swift async Closure »

标签: arrays swift dictionary google-cloud-firestore


【解决方案1】:

最后用下面的代码让它工作:

var fetchedIDs = ["ID1", "ID2", "ID3"]
func loadData(com:@escaping( ([[String: Any]]) -> ())){
                var myArray = [[String: Any]]()

                for id in fetchedIDs{
                    let refLike = db.collection("Data").document(id)
                    refLike.getDocument { (document, error) in
                        if let err = error {
                            print("Error getting documents: \(err)")
                        } else {
                            let myDict: [String: Any] = document?.data() as! [String: Any]
                            myArray.append(myDict)
                        }
                        com(myArray)
                    }
                }
            }


            loadData(){ arr in
                if (arr.count == fetchedIDs.count){
                    print ("User 1 has the following data: \(arr[0])")
                    print ("User 2 has the following data: \(arr[1])")
                }
            }

【讨论】:

    猜你喜欢
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    • 2021-05-30
    • 1970-01-01
    • 2013-12-01
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多