質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

解決済

tableviewのセルがしばらく表示されない

tarofess
tarofess

総合スコア0

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

1回答

0評価

0クリップ

2667閲覧

投稿2016/12/26 12:10

アプリを起動するとサーバからデータを引っ張ってきてtableviewに表示させようとしているのですが、アプリが起動してもしばらくtableviewにデータが表示されず、10秒くらい経つとやがてデータが表示されます。
10秒くらい経つとcellForRowAtが呼ばれることを確認しました。
しかしアプリを起動した後すぐにtableviewをスクロールするとデータが表示されます。
つまり、アプリを起動して放っておくと時間差でデータが表示されるのですが、アプリを起動してtableviewをスクロールするとデータがtableviewに表示されます。
どうしてこんなことが起こるのか全くわかりません。
アプリが起動したらすぐにtableviewにそのままデータが表示されるようにしたいです。
下記にtableviewとapi通信周りのコードを記します。
どなたかわかる方がいれば教えていただきたいです。よろしくお願いします。

swift

ViewController override func viewDidLoad\(\) { super\.viewDidLoad\(\) self\.getHitokotoFromServer\(\) } func getHitokotoFromServer\(\) { HitokotoManager\.sharedInstance\.hitokots\.removeAll\(\) let myUrl = URL\(string: "http://localhost/hitokoto/getAll\.php"\) if let url = myUrl { HitokotoAPIClient\.sharedInstance\.requestHitokotoGet\(url: url, completion: {\(result: Result\) in switch result { case \.success\(let json\): json\.forEach\({ let hitokoto = Hitokoto\(\) hitokoto\.setHitokoto\(hitokoto: \$0\) HitokotoManager\.sharedInstance\.hitokots\.append\(hitokoto\) }\) HitokotoManager\.sharedInstance\.hitokots\.sort\(by: {\$0\.date\.compare\(\$1\.date\) == \.orderedDescending}\) self\.tableView\.reloadData\(\) case \.failure: break } }\) } } func setupTableView\(\) { self\.tableView\.estimatedRowHeight = 44 self\.tableView\.rowHeight = UITableViewAutomaticDimension } // MARK: - UITableViewDataSource func tableView\(_ tableView: UITableView, numberOfRowsInSection section: Int\) -> Int { if self\.searchController\.isActive { return self\.searchResults\.count } else { return HitokotoManager\.sharedInstance\.hitokots\.count } } func tableView\(_ tableView: UITableView, cellForRowAt indexPath: IndexPath\) -> UITableViewCell { if self\.isShowingDetailCell { let cell = tableView\.dequeueReusableCell\(withIdentifier: "HitokotoTableViewDetailCell", for: indexPath\) as! HitokotoDetailTableViewCell if self\.searchController\.isActive { cell\.fillWith\(hitokoto: self\.searchResults\[indexPath\.row\]\) } else { cell\.fillWith\(hitokoto: HitokotoManager\.sharedInstance\.hitokots\[indexPath\.row\]\) } return cell } else { let cell = tableView\.dequeueReusableCell\(withIdentifier: "HitokotoTableViewCell", for: indexPath\) as! HitokotoTableViewCell if self\.searchController\.isActive { cell\.fillWith\(hitokoto: self\.searchResults\[indexPath\.row\]\) } else { cell\.fillWith\(hitokoto: HitokotoManager\.sharedInstance\.hitokots\[indexPath\.row\]\) } return cell } }

Swift

HitokotoAPIClient func requestHitokotoGet\(url: URL, completion: @escaping \(Result\) -> Void\) { var request = URLRequest\(url: url\) request\.httpMethod = "GET" URLSession\.shared\.dataTask\(with: request, completionHandler: {\(data, response, error\) in if error == nil && data != nil { let jsonObject = try\? JSONSerialization\.jsonObject\(with: data!, options: \.allowFragments\) as\? \[\[String: Any\?\]\] if let json = jsonObject\?\.flatMap\({\$0}\) { completion\(Result\.success\(json: json\)\) } } else { completion\(Result\.failure\) } }\)\.resume\(\) }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています