2016-11-23 2 views
0

を渡す前に、私の機能で完成されていることを確認こんにちは、私はこの機能を持っている:スウィフト:urlSession.dataTask結果

私は何をしようとしていますが、私は時のtableViewのcellforrowにplanResultのための結果を得たことを確認することです
func planAdded(id:Int, user_id:Int) -> Int { 
    let locationURL = "myurl" 
    var planResult: Int = 0 
    let request = URLRequest(url: URL(string: locationURL)!) 
    let urlSession = URLSession.shared 
    let task = urlSession.dataTask(with: request, completionHandler:{ 
     (data, response, error) -> Void in 

     DispatchQueue.main.async { 

      if let error = error { 
       print (error) 
       return 
      } 

      if let data = data { 

       let responseString = NSString(data: data, encoding: String.Encoding.utf8.rawValue) 
       planResult = responseString!.integerValue 

      } 
     } 


    }) 

    task.resume() 
    print(planResult) 

    return planResult 
} 

indexpath関数。ここで

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    ... 
    case 4: 



     if (result == 1){ 
      ... 
     } else if (result == 2){ 
      ... 
     } else { 
      ... 
     } 


    default: 
     cell.fieldLabel.text = "" 
    } 

    return cell 

} 

が私のviewDidLoad関数は、いくつかの理由から

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.result = self.planAdded(1, 2) 
} 

で、これは0を返す続けます。ただし、印刷ラインは実際に正しい値を印刷しています。私はいくつかの研究を行い、これはdataTaskの無神経な呼び出しのためだと信じています。関数が実際に完了し、indexpath関数の値を返す方法がありますか? ありがとう

答えて

1

理由は間違っています!したがって、classを初期化すると、UIViewControllerのライフサイクルが開始されるためです。 viewDidLoad()が呼び出されると、UITableViewもデータなしで更新されます。

また、APIを呼び出してデータを取得する場合は、データを更新するためにUITableViewDataSourceに通知する必要があります。ここでその方法を説明します。

func planAdded(id:Int, user_id:Int) { 
    let locationURL = "myurl" 
    var planResult: Int = 0 
    let request = URLRequest(url: URL(string: locationURL)!) 
    let urlSession = URLSession.shared 
    let task = urlSession.dataTask(with: request, completionHandler:{ 
     (data, response, error) -> Void in 

     DispatchQueue.main.async { 

      if let error = error { 
       print (error) 
       return 
      } 

      if let data = data { 

       let responseString = NSString(data: data, encoding: String.Encoding.utf8.rawValue) 
       self.result = responseString!.integerValue 
       self.tableView.reloadData() 
      } 
     } 
    }) 
    task.resume() 
} 

そして、それはasync方法ですので、あなたがzero値を取得しています。だから、あなたはcompletionCallbackを使用する必要があるデータを取得します。

func planAdded(id:Int, user_id:Int, completion: (result: Int) ->()) { 
    let locationURL = "myurl" 
    var planResult: Int = 0 
    let request = URLRequest(url: URL(string: locationURL)!) 
    let urlSession = URLSession.shared 
    let task = urlSession.dataTask(with: request, completionHandler:{ 
     (data, response, error) -> Void in 

    DispatchQueue.main.async { 

     if let error = error { 
      print (error) 
      return 
     } 

     if let data = data { 

      let responseString = NSString(data: data, encoding: String.Encoding.utf8.rawValue) 
      planResult = responseString!.integerValue 
      completion(planResult)    
      } 
     } 
    }) 
    task.resume() 
} 

使用法:表は二回リロードする必要がありますが、正しい値が返され

override func viewDidLoad() { 
    super.viewDidLoad() 
    planAdded(1, 2){(value) in 
     self.result = value 
     self.tableView.reloadData() 
    } 
} 
+0

はい。もう一つ質問があります。結果が== 1になったら、ボタンを作成してサブビューとして追加しました。 cell.addSubview(myButton)。しかし、テーブルをリロードして結果が== 2になると、ボタンは消えませんでした。私はそれをクリアする方法はありますか?ありがとう。 – loveprogramming