如何仅在 Swift 中的 for 循环执行完毕后才 return 执行某些操作?

How do I return something only after a for-loop finishes executing in Swift?

我想获取一段时间内每天记录的 'pieces' 的数量并将其相加,因此我使用了 for 循环并遍历该时间段。但是,它似乎正在异步执行以下操作,因此只返回 0。这是我的代码:

func getPiecesInPeriod(period: Int, uid: String) -> Int{
    //period = #days
    var pieces = 0
    for i in 0..<period {
        let date = Date().addingTimeInterval(TimeInterval(-86400*i))
        Firestore.firestore().collection("Users").document(uid).collection("Log").document(getDayMonthYear(date: date)!).getDocument() {(document, err) in
            if let err = err {
                print("Error getting documents: \(err)")
            } else if document?.get("total pieces") != nil {
                pieces += document!.get("total pieces") as! Int
            }
        }
    }
return pieces
}

我尝试使用完成处理程序:

func getPiecesInPeriod(period: Int, uid: String, completion: @escaping (Int) -> Void) {
    //period = #days
    var pieces = 0
    for i in 0..<period {
        let date = Date().addingTimeInterval(TimeInterval(-86400*i))
        Firestore.firestore().collection("Users").document(uid).collection("Log").document(getDayMonthYear(date: date)!).getDocument() {(document, err) in
            if let err = err {
                print("Error getting documents: \(err)")
            } else if document?.get("total pieces") != nil {
                pieces += document!.get("total pieces") as! Int
                print(document?.documentID)
                print(pieces)
            }
            completion(pieces)
        }
    }
}

但无论我把 'completion(pieces)' 行放在哪里,它似乎都不起作用。有什么想法吗?

您需要完成处理程序来执行此操作,然后您需要确保仅在获得所有期间的数据后才调用它。考虑到这个定义,实际上并没有那么难:如果您对已经加载的件数进行计数器,则可以将其与需要加载的总数进行核对。

所以像这样:

func getPiecesInPeriod(period: Int, uid: String, completion: @escaping (Int) -> Void) {
    //period = #days
    var pieces = 0
    var count = 0
    for i in 0..<period {
        let date = Date().addingTimeInterval(TimeInterval(-86400*i))
        Firestore.firestore().collection("Users").document(uid).collection("Log").document(getDayMonthYear(date: date)!).getDocument() {(document, err) in
            if let err = err {
                print("Error getting documents: \(err)")
            } else if document?.get("total pieces") != nil {
                pieces += document!.get("total pieces") as! Int
                print(document?.documentID)
                print(pieces)
            }
            if count++ = period {
                completion(pieces)
            }
        }
    }
}