これは本当に簡単な質問かもしれないので、私はかなり新しいですが、完了時にリストを返すメソッドを作成しようとしていますが、メソッドを呼び出そうとすると私は満足する方法がわからない、逃げ出しているパラメータを逃していると言います。ここでメソッド呼び出しがパラメータとしてメソッドを要求する
はメソッドです:
self.ListOfFiles = fillFromFile()
とエラーが "コールの引数パラメータ 'completionblock' を欠落" さ
これは本当に簡単な質問かもしれないので、私はかなり新しいですが、完了時にリストを返すメソッドを作成しようとしていますが、メソッドを呼び出そうとすると私は満足する方法がわからない、逃げ出しているパラメータを逃していると言います。ここでメソッド呼び出しがパラメータとしてメソッドを要求する
はメソッドです:
self.ListOfFiles = fillFromFile()
とエラーが "コールの引数パラメータ 'completionblock' を欠落" さ
方法:ここ
func fillFromFile(completionBlock: @escaping ([Asset_Content]) ->()) {
let url = "URL STRING"
LoadJSONFile(from: url) { (result) in
// The code inside this block would be called when LoadJSONFile is completed. this could happen very quickly, or could take a long time
//.map is an easier way to transform/iterate over an array
var newContentArray = [Asset_Content]()
for json in result{
let category = json["BIGCATEGORY"] as? String
let diagnosis = json["DIAGNOSIS"] as? String
let perspective = json["PERSPECTIVE"] as? String
let name = json["NAME"] as? String
let title = json["Title"] as? String
let UnparsedTags = json["TAGS"] as? String
let filename = json["FILENAME"] as? String
let tagArray = UnparsedTags?.characters.split(separator: ",")
for tag in tagArray!{
if(!self.ListOfTags.contains(String(tag))){
self.ListOfTags.append(String(tag))
}
}
let asset = Asset_Content(category!, diagnosis!, perspective!, name!, title!, filename!)
// This is a return to the map closure. We are still in the LoadJSONFile completion block
newContentArray.append(asset)
}
print("return count ", newContentArray.count)
// This is the point at which the passed completion block is called.
completionBlock(newContentArray)
}
}
は、メソッドの呼び出しがありますcompletionBlockを使用したメソッドの応答は次のようになります:
fillFromFile { (response) in
self.ListOfFiles = response
}
このように、'ListOfFiles '変数には、メソッドに含まれる新しい変数が設定されます。あなたはfillFromFile
関数は何も返さないことDispatchQueue
DispatchQueue.main.async {
completionBlock(newContentArray)
}
お知らせを持つべきであるあなたの関数の戻り値で
。これは非同期関数です。これは、それが呼び出されたスレッドの主な制御フローとは独立して作業を行うことを意味します。それはほぼ即座に戻ってくるだろうし、その後は何か不明な時間を遂行する。
この関数の結果を得るには、補完ハンドラが必要です。これは、コードが最終的に作業を完了したときに呼び出されるクロージャです。このクロージャのパラメータとして、作業結果(Array<Asset_Content>
)が渡されます。私は、あなたがlanguage guideを読んで閉鎖に特にそのセクションを示唆して
fillFromFile { (response) in
print(response)
}
:
は、ここでは、このメソッドシグネチャを満足する方法の簡単な例です。
私はこれを実装しましたが、fillFromFile呼び出し後にprintステートメントを実行しようとすると、self.ListOfFilesは空です。 –
'fillFromFile { self.ListOfFiles中(レスポンス)=応答 } プリント( "リスト・カウント=="、self.ListOfFiles.count)' –
は、この非同期ループから抜け出す方法はありませんか?私はグローバルな使用のためにデータを取得しようとし続け、それは同じ問題を続けます。 –