読者です 読者をやめる 読者になる 読者になる

swiftでのapi通信処理を共通化する方法 - UITableView編

はじめに

swiftでのapi通信処理を共通化する方法 - とりあえずphpとか
こちらの続きです。前回は画面が表示されるときに、APIを叩いて通信が完了したらviewを画面に追加する。というのものでした。

今回はアプリでよくある無限スクロールみたいのを実装します。
UITableViewの1番下までスクロールしたらAPIをたたいて、UITableViewに追加して再描画。という流れになるかと思います

実装方法

SampleViewController.swif

import UIKit
import Alamofire

class SampleViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    
    var tableView: UITableView! // テーブルビュー
    var tableData: [AnyObject]! // テーブルデータ
    var isLoading:Bool = false // 読み込み中フラグ
    var objApi = ApiSample() // APIクラス
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // テーブルデータ初期化
        tableData = [AnyObject]()
        
        // データ取得
        self. objApiSample.get(callbackApi)
        
        // テーブルビュー追加
        tableView = UITableView(frame: CGRect(x:0, y:0, width:displayWidth, height:displayHeight))
        tableView.registerClass(UiTableViewCell.self, forCellReuseIdentifier: "Cell")
        tableView.delegate = self
        tableView.dataSource = self
        self.view.addSubview(tableView)
    }

    // ・・・ おきまりのテーブルビューのデリゲートメソッドは省略します

    // テーブルの最下部までスクロールされたときの処理を実装します
    func scrollViewDidScroll(scrollView: UIScrollView) {
        var contentOffsetWidthWindow = self.tableView.contentOffset.y + self.tableView.bounds.size.height
        var eachToBottom = contentOffsetWidthWindow >= self.tableView.contentSize.height
        if (!eachToBottom || self.isLoading) {
            return;
        }
        self.isLoading = true
        self.objApiSample.get(callbackApi)
    }

    // コールバックメソッドを実装します
    func callbackApi() {
        if let list = self.objApi.result["data"] as? Array<Dictionary<String,AnyObject>> {
            for row in list {
                self.tableData.append(row)
            }
        }
        self.isLoading = false
        self.tableView.reloadData()
    }

ApiSampleクラスは前回と同じものを使ったのでこちらを参考にしてください。

以上です