2017-07-04 21 views
0

これは本当に簡単な質問かもしれないので、私はかなり新しいですが、完了時にリストを返すメソッドを作成しようとしていますが、メソッドを呼び出そうとすると私は満足する方法がわからない、逃げ出しているパラメータを逃していると言います。ここでメソッド呼び出しがパラメータとしてメソッドを要求する

はメソッドです:

self.ListOfFiles = fillFromFile() 

とエラーが "コールの引数パラメータ 'completionblock' を欠落" さ

答えて

2

方法:ここ

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) 
} 
+0

私はこれを実装しましたが、fillFromFile呼び出し後にprintステートメントを実行しようとすると、self.ListOfFilesは空です。 –

+0

'fillFromFile { self.ListOfFiles中(レスポンス)=応答 } プリント( "リスト・カウント=="、self.ListOfFiles.count)' –

+0

は、この非同期ループから抜け出す方法はありませんか?私はグローバルな使用のためにデータを取得しようとし続け、それは同じ問題を続けます。 –

0

お知らせを持つべきであるあなたの関数の戻り値で

。これは非同期関数です。これは、それが呼び出されたスレッドの主な制御フローとは独立して作業を行うことを意味します。それはほぼ即座に戻ってくるだろうし、その後は何か不明な時間を遂行する。

この関数の結果を得るには、補完ハンドラが必要です。これは、コードが最終的に作業を完了したときに呼び出されるクロージャです。このクロージャのパラメータとして、作業結果(Array<Asset_Content>)が渡されます。私は、あなたがlanguage guideを読んで閉鎖に特にそのセクションを示唆して

fillFromFile { (response) in 
    print(response) 
} 

は、ここでは、このメソッドシグネチャを満足する方法の簡単な例です。

関連する問題