私はgroupchatID(String)を受け取り、そのグループチャットの受信者([String])のリストを返す関数を書いています。私はしかし、関数の非同期部分で苦労しています。関数を実行すると、私は探していたユーザー名の配列をコンソールに正しく表示します。関数を呼び出して、返された値を出力しようとすると、ファイヤーベース呼び出しが完了する前に配列が返されるため、常に空の配列になります。私はコールバックを使用しようとしていますが、私はすべての構文を理解していません。一度見て、何を変更する必要があるか教えてください。非同期firebase呼び出しから値を返すSwift関数
機能:
私は関数を呼び出す方法func GetRecipientsFor(GroupChatID :String , completion: @escaping ([String]) ->()) {
var returnArray: [String] = [""]
rootRef.child("chatMembers").child(GroupChatID).observeSingleEvent(of: .value, with: { (snapshot) in
for child in snapshot.children.allObjects {
var append = child as! FIRDataSnapshot
returnArray.append((append.key as String))
print("Return Array Currently Contains: \(returnArray)")
//The above printout works properly and when the for loop finishes, the array is exactly as I want it
}
completion(returnArray)
//BUT, this portion returns an empty array
})
}
:
GetRecipientsFor(GroupChatID: gchatID) { (result) ->() in
print(result)
}
NEW関数呼び出し
var recipients : [String] = [""]
DispatchQueue.main.async {
GetRecipientsFor(GroupChatID: gchatID) { result in
print(result) //PRINTS CORRECTLY!!!
recipients = result
}
}
print(recipients) //PRINTS A BLANK ARRAY
はい、 '完了(returnArray)'の前後に印刷を追加してください。他にも欠けているものがいくつかあります。これはそのまま動作するはずです。 –
'var returnArray:[String] = [" "]'をクロージャの内側に置いてみましたか? – skwashua