2017-07-02 11 views
0

フルフルJsonData配列 を埋めるためにこれを持っていて、私はクロージャー後に値を操作したいと思っています。エスケープクロージャー値を操作する

func getNewsAsDic(completionHandler: @escaping ([fullJsonData]) -> [fullJsonData]) { 

    let session = URLSession.shared 
    let dataTask = session.dataTask(with: requestNewsForToday()) { data, _, error in 
     if error == nil { 
      if let dic = try? JSONSerialization.jsonObject(with: data!, options: []) as? NSDictionary { 
       var dataArray = [fullJsonData]() 

       let jdata = dic?["articles"] as! [[String:Any]] 

       for item in jdata { 

        let data = fullJsonData(author: item["author"] as? String, 
              description: item["description"] as? String, 
              publishedAt: item["publishedAt"] as? String, 
              title: item["title"] as? String, 
              url: item["url"] as! String, 
              imageURL: item["urlToImage"] as? String) 

        print(item["author"] as! String) 
        print(item["description"] as! String) 
        print(item["title"] as! String) 
        print(item["urlToImage"] as! String) 
        print(item["url"] as! String) 
        print(item["urlToImage"] as! String) 
        print(item["publishedAt"] as! String) 

        dataArray.append(data) 
       } 
       completionHandler(dataArray) 
       print(jdata.count) 
      } 
     } else { 
      return 
     } 
    } 
    dataTask.resume() 
} 

だから、問題がある: 1)、そして、私はこのようなプロジェクトでそれを使用しようとしています何Result of call is unused, but produces '[fullJsonData]' 2)Xcodeのエラー:Cannot assign value of type '()' to type '[fullJsonData]'

var dataArray = [fullJsonData]() 
     dataArray = NetworkManager.shared.getNewsAsDic(completionHandler: { dict in 
      return dict 
     }) 

があまりにもエラーが発生しました

閉鎖の値を取って使用するのは本当ですか?

func getNewsAsDic(completionHandler: @escaping ([fullJsonData]) -> [fullJsonData]) { 

:あなたはからあなたの完了ハンドラの署名を変更する必要があり

答えて

0

func getNewsAsDic(completionHandler: @escaping ([fullJsonData]) -> Void) { 

そしてへのあなたの呼び出しを変更します。また

NetworkManager.shared.getNewsAsDic(completionHandler: { myArray in 
    // Do whatever you want with myArray here 
}) 

、あなたが名前を変更する必要がありますgetNewsAsDicの場合、実際に配列を返すためです。

+0

しかし、閉鎖外のmyArr値で何かしたいです。 take countや他の関数での実装を好む –

+0

'session.dataTask'への呼び出しは、サーバからの応答を得るのに20秒かかるかもしれないが、コードの実行は止まらないので、非同期(または非ブロック)です。だからこそあなたは 'completion'コールバックを持っています。これは、サーバレスポンスを受け取ったときに実行したいコードを置く場所です。 – paulvs

0

は、あなたの代わりにあなたのコードの

var dataArray: [fullJsonData] = []を使用する必要がありそうです。

関連する問題