私のアプリでは、以下のように「一番下にもっと読み込む」プロパティを使用しています。実際には問題なく動作します。唯一の問題は、ユーザーが最下部に到達したときに、追加の読み込み機能が機能しているときに、UIRefreshcontrol
のようなアニメーションビューがないため、アプリがしばらくフリーズしているように見えることです。新しいデータが読み込まれるまでアニメーションを表示するにはどうすればよいですか。いくつかのUIBottomrefreshcontrol
プロパティを個別のライブラリとして見つけましたが、それらはすべてObjective-cにありました。
override func viewDidLoad() {
super.viewDidLoad()
refreshResults()
}
func refreshResults() {
refreshPage = 40
// here the query starts
}
func refreshResults2() {
// here the query starts to add new 40 rows of data to arrays
}
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
if indexPath.row == refreshPage-1 {
refreshPage = refreshPage + 40
refreshResults2()
}
}
UITableViewControllerにUIActivityIndicatorView
(つまりスピナー)を追加します。コンセントをコードに接続します。
_@IBOutlet weak var spinner: UIActivityIndicatorView!
_
UITableViewController
にプロパティを追加して、現在より多くのデータをロードしていることを追跡し、2回実行しようとしないようにします。
_var loadingData = false
_
スピナーのアニメーションを開始してから、refreshResults2()
を呼び出します。
_func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
if !loadingData && indexPath.row == refreshPage - 1 {
spinner.startAnimating()
loadingData = true
refreshResults2()
}
}
_
refreshResults2()
をバックグラウンドスレッドで実行します。これにより、テーブルを自由に動かすことができます。アニメーション化されたスピナーは、より多くのデータが来ることをユーザーに知らせます。クエリが返されたら、メインスレッドのテーブルデータを更新します。
_func refreshResults2() {
dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0)) {
// this runs on the background queue
// here the query starts to add new 40 rows of data to arrays
dispatch_async(dispatch_get_main_queue()) {
// this runs on the main queue
self.refreshPage += 40
self.tableView.reloadData()
self.spinner.stopAnimating()
self.loadingData = false
}
}
}
_
- Swift 3、Xcode 8
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
let lastElement = dataSource.count - 1
if !loadingData && indexPath.row == lastElement {
spinner.startAnimating()
loadingData = true
loadMoreData()
}
}
@vacawama async call in Swift 3:-
func loadMoreData() {
DispatchQueue.global(qos: .background).async {
// this runs on the background queue
// here the query starts to add new 10 rows of data to arrays
DispatchQueue.main.async {
// this runs on the main queue
self.spinner.stopAnimating()
self.loadingData = false
}
}
}