2016-12-05 7 views
0

httpリクエスト(JSON)から取得されたデータをテーブルビューに取り込みしようとしていますが、動作しません。私は静的データとテーブルビューを移入した場合、すべてが正常に動作します。..コードスニペット:テーブルビューがHTTPリクエストによってフェッチされたデータで更新されない

import UIKit 
import Alamofire 
//import SwiftyJSON 

class ViewControllerNews : UITableViewController{ 
@IBOutlet var table: UITableView! 

var posts = [FacebookPost]() 

override func viewDidLoad() { 
    pullFacebookNews() 
    //loadSampleNews() 
    super.viewDidLoad() 

} 

func pullFacebookNews() -> Void { 


    let params = ["limit":"100", "access_token": myaccesstoken] 


    Alamofire.request("https://graph.facebook.com/<page-id>/posts", parameters: params).responseJSON{ response in 

    if let responsejson = response.result.value { 
     let JSON = responsejson as! NSDictionary 
     let itemsArray: NSArray? = JSON.object(forKey: "data") as? NSArray 

     if(itemsArray != nil) { 
      for item in itemsArray! { 

      let thisitem = item as! NSDictionary 
      print(thisitem.object(forKey: "message") as? String) 
      print(thisitem.object(forKey:"created_time") as? String) 
      let title1 = thisitem.object(forKey: "message") as? String 
      let value1=thisitem.object(forKey:"created_time") as? String 
      if(title1 != nil && value1 != nil) { 
        let news = FacebookPost(title: title1!, value: value1!) 
        self.posts.append(news) 
       } 

      }} 

     } 
    } 
do_table_refresh() 
} 

func do_table_refresh() { 


DispatchQueue.global(qos: .background).async { 

DispatchQueue.main.async { 
self.table.reloadData() 
} 
} 
} 
func loadSampleNews() { 
    let news1 = FacebookPost(title: "ich bin ein datum", value: "Ich bin eine news") 

    let news2 = FacebookPost(title: "ich bin ein datum2", value: "Ich bin eine news2") 

    let news3 = FacebookPost(title: "ich bin ein datum3", value: "Ich bin eine news3") 

    posts += [news1, news2, news3] 
} 

override func numberOfSections(in: UITableView) -> Int { 
    return 1 
} 
override func tableView(_: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return posts.count 
} 
override func tableView(_: UITableView, cellForRowAt: IndexPath) -> UITableViewCell { 
    let cellIdentifier = "NewsTableViewCell" 
    let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: cellForRowAt as IndexPath) as! NewsTableViewCell 

    let news = posts[cellForRowAt.row] 

    cell.date.text = news.title 
    cell.news_text.text = news.value 

    return cell 
} 
} 

loadSampeNews()完璧に動作しますが、pullFacebookNews()は、テーブルを移入しません。

+0

テーブルビューのデータソース/デレゲート設定はありますか? – zsteed

答えて

2

ブレークポイントを設定すると、if let responsejson = response.result.valueをヒットする前にdo_table_refresh()が呼び出されることがわかります。これは、Alamofireコールに完了ハンドラがあるためです。 do_table_refresh()に電話する前に、インターネット通話が完了するまで待つ必要があります。

あなたが言うようにすべてのデータが正しく読み込まれている場合は、基本的にはdo_table_refresh()に移動するだけです。

func pullFacebookNews() -> Void { 
    let params = ["limit":"100", "access_token": myaccesstoken] 
    Alamofire.request("https://graph.facebook.com/<page-id>/posts", parameters: params).responseJSON{ response in 

    if let responsejson = response.result.value { 
     let JSON = responsejson as! NSDictionary 
     let itemsArray: NSArray? = JSON.object(forKey: "data") as? NSArray 

     if(itemsArray != nil) { 
     for item in itemsArray! { 
      let thisitem = item as! NSDictionary 
      print(thisitem.object(forKey: "message") as? String) 
      print(thisitem.object(forKey:"created_time") as? String) 
      let title1 = thisitem.object(forKey: "message") as? String 
      let value1=thisitem.object(forKey:"created_time") as? String 
      if(title1 != nil && value1 != nil) { 
      let news = FacebookPost(title: title1!, value: value1!) 
      self.posts.append(news) 
      } 
     } 
     } 
     self.do_table_refresh() 
    } 
    } 
} 

さらに、この構文でメソッド名を指定しないでください。ベストプラクティスではありません。 doTableRefresh()などが必要です。

+0

は完璧に動作します、ありがとう! – Progph

+1

偉大な:)正しいと私の答えをマークできますか? –

関連する問題