2016-11-03 15 views
-1

テーブルビューコントローラでいくつかの記事が読み込まれ、いくつかのAPIから読み込まれ、解析された場合、どのように振る舞うべきかを知りたいと思います。次に、彼の詳細を見るためにいくつかの記事をクリックしたいと思います。セグが完了した後にデータを再度ロードする

起動時にすべてのデータをすべてのデータで読み込み、具体的な全記事を次の詳細テーブルコントローラに渡すか、記事IDを送信して、新しいテーブルコントローラに渡します。

私はこれがはるかに優れた第2の方法だと思いますが、どうやってそれを行うのか分かりません。どんな助け?どうもありがとう。

EDIT:追加コード

MainTableViewController:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    let articleId = articles[indexPath.row].Id 
    let destination = DetailTableViewController() 
    destination.articleId = articleId 

    destination.performSegue(withIdentifier: "Main", sender: self) 
} 

DetailTableViewController:

override func viewDidLoad() { 
    super.viewDidLoad() 

    tableView.rowHeight = UITableViewAutomaticDimension 
    tableView.estimatedRowHeight = 140 

    // Vyzkoušíme jestli jsme připojeni do internetu 
    if Helper.hasConnectivity() { 
     // Zapneme načítací obrazovku 
     setLoadingScreen() 

     // Načteme jídla 
     loadMainArticles() 
    } else { 
     promptAlert(title: "Upozornění", message: "Ujistěte se, že Vaše zařízení je připojené k internetu") 
    } 
} 

private func loadMainArticles() { 
    ApiService.sharedInstance.fetchArticle(part: "GetArticle", articleId: "brananske-posviceni--spravna-lidova-zabava-s-pecenou-husou") { (articles: [Article]) in 
     self.removeLoadingScreen() 

     self.tableView.separatorStyle = .singleLine 

     if articles.count == 0 { 
      self.promptAlert(title: "Upozornění", message: "Žádná data") 
     } 

     self.selectedArticle = articles[0] 
     self.tableView.reloadData() 
    } 
} 

ApiService:

func fetchArticle(part: String, articleId: String, completion: @escaping ([Article]) ->()) { 
    var Id = "" 
    var Title = "" 
    var Content = "" 
    var Picture = "" 
    var PublishDate = "" 

    let url = NSURL(string: "http://xxx") 

    URLSession.shared.dataTask(with: url! as URL) { (data, response, error) in 

     if error != nil { 
      print(error as Any) 
      return 
     } 

     do { 
      let json = try! JSONSerialization.jsonObject(with: data!, options: .allowFragments) 

      var articles = [Article]() 

      for dictionary in json as! [[String: AnyObject]] { 
       . 
       . 
       . 

       let article = Article(Id: Id, Title: Title, Content: Content, Picture: Picture, PublishDate: PublishDate, Categories: Categories) 

       articles.append(article!) 
      } 

      DispatchQueue.main.async(execute: { 
       completion(articles) 
      }) 

     } 

     }.resume() 

} 

問題はそのIであります行をクリックした後にセグを行い、次にloadMainArticlesを実行します。このメソッドはトリガーされますが、URLSession行では常に停止し、直ちにresume()にジャンプし、完了ブロックはトリガーされません。何らかの理由がありますか?

答えて

0

これは、記事データモデルのサイズに従って行う必要がある選択です。

TableView単一セルに表示する必要があるデータと、商品詳細ページに表示する必要があるデータに注意してください。

は、私はあなたが示すこととします

  • タイトルは、この場合は詳細ページ

で、テーブルビューではおそらくいくつかの画像を

  • タイトル、時間、長い説明を時間を掲示し、私はreccommendうそれぞれの記事アイテムのタイトルと時間のみをダウンロードしてから、詳細ページで1つのアイテムの詳細をダウンロードします(ユーザーが各アイテムを開くことができなかったため、未使用のコンテンツをダウンロードしないでください)。

    データ量が類似している場合は、他のネットワーク要求を行わずに、最初の接続と詳細のページですべての情報をダウンロードしてください。

    私はこれがはるかに優れた第2の方法だと思いますが、どうやってそれを行うのか分かりません。

    TableViewで選択したセルから商品IDを取得し、prepareForSegueを使用してDetailPageViewControllerに渡す必要があります。 DetailPageViewControllerでViewDidLoadは記事IDをバックエンドAPIに送信し、表示する記事の詳細を取得します。

  • +0

    すべての記事を読み込む際に言ったように、私はこれを行っています。 ViewDidLoadでは、APIメソッドGetAllArticles(URLSession.shared.datataskを使用)を呼び出して、常に私が望むものを完了ブロックに戻しますが、Segue経由で記事IDを渡したPageDetailTableViewControllerのsegueの後にこれを実行すると、メソッドは常に最初の行で停止しますURLSession.shared.datatask)、次に.resume()にジャンプします。完了ブロックはトリガーされません。これは私が直面している問題です... –

    +0

    あなたの質問にいくつかのコードを追加する必要があります。 – lubilis

    +0

    質問を編集していくつかのコードを追加しました... –

    関連する問題