如何仅在 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)
}
}
}
}
我想获取一段时间内每天记录的 '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)
}
}
}
}