table viewが未完成の状態でも、完成部分については表示されるようにしたい。
table view のcellを生成するための処理が重く、全てを完成してから表示するスタイルだと
ユーザーをかなり待たせることになってしまうので、cellが生成し次第、cellを表示するように
したいと思いここ数日作業をしているのですが、うまくいきません。
アドバイスをご教示いただけたらと思います。
ViewController
1 override func viewDidLoad() { 2 super.viewDidLoad() 3 重い処理A() //この重い処理がすべて完了してから、セルが生成されます。 4 tableView.reloadData() 5 } 6 7 8 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 9 return 10 10 } 11 12 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 13 let cell = tableView.dequeueReusableCell(withIdentifier: "tableViewCell", for: indexPath) 14 重い処理B()//セルの生成にはこの処理の影響で時間がかかります。 15 return cell 16 } 17 18
重い処理とはどのような性質のものですか? データを用意するのと、それを表示するのと、どちらが重いのでしょうか? 一般論としてはバックグラウンドで処理するとか処理結果をキャッシュするとか一覧画面ではプレビュー的なものを表示して詳細画面で詳しく表示するなどが考えられますが…。
コメントありがとうございます。
重い処理Aは、これから表示するコンテンツを特定するためのkeyの一覧の作成処理で、重い処理Bは、重い処理Aによって取得されたkeyを用いて、データをスクレイピングする処理になります。なので、Aの完了がB開始の条件となっています。かかる時間は、Aが15秒、Bが一つのセルあたり5秒くらいだと思います。
Aについてはuserdefaultの活用によりキャッシュが可能ですが、Bに関してはちょっとアイデアが浮かびません。プレビューについても、このviewで情報を得られないとあまり意味がなくなってしまう状況です。
よろしくお願いします。
なるほど、それは重そうですね。スクレイピングに関しては、データを取得する部分はバックグラウンドで並行して処理できる (というか、cellForRowAt で実際にデータ取得などの処理を行うのは良くない) と思いますが、タスクを管理するのが面倒でしょうね。頑張ってください。
大変貴重なご意見ありがとうございます。
早速、cellForRowAtでのデータ取得処理を他の部位に移動いたしましたところ、
動作が早くなったように感じます。
丁寧なご指摘、ご対応どうもありがとうございました。
回答1件
あなたの回答
tips
プレビュー