使用alamofire和swiftyjson在mysql的表视图中显示数据

时间:2018-10-28 13:31:20

标签: ios swift swift4 alamofire swifty-json

我的服务器上有一个php脚本,它只是一个基本的sql SELECT语句,它从mysql数据库中获取一些数据,并返回许多行。

我已经使用alamofire和swiftyjson将数据打印到控制台,但是我想在表视图中显示它。

由于调用与tableView代码不在同一范围内(我认为这是我收到一条错误消息,提示“使用未解决的标识符”的原因)

我不确定如何将其设置为全局,但是我想我需要创建一个全局数组变量,但不确定是否应该将其设置为空?

全局:

 let serviceURL = "http://example.com/service.php"

我将其放在这样的函数中:

    func getUsers() {

    Alamofire.request(serviceURL, method: .get).validate().responseJSON { (response) in

        if response.result.isSuccess {

            let userJSON : JSON = JSON(response.result.value!)


            for (index,subJson):(String, JSON) in userJSON  {
                let firstName = subJson["first_name"].string 
                let lastName = subJson["last_name"].string
                print(firstName)
            }

        } else {

            print("Could not get results")
        }
    }
}

我需要计算返回的行数

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

   return firstName.count

}

然后实际显示在单元格中

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "userCell", for: indexPath)

    cell.textLabel?.text = names[indexPath.row]

    return cell
}

更新

import UIKit
import Alamofire
import SwiftyJSON

struct User {
    var firstName: String
    var lastName: String

    private enum CodingKeys: String, CodingKey {

        case firstName = "first_name"
        case lastName = "last_name"
    }
}

class UserTableViewController: UITableViewController {

    var users = [User]()

    let serviceURL = "http://example.com/service.php"


    override func viewDidLoad() {
        super.viewDidLoad()
        getUsers()

    }


    func getUsers() {
        Alamofire.request(serviceURL, method: .get).validate().responseJSON { (response) in
            if response.result.isSuccess {
                let userJSON : JSON = JSON(response.result.value!)

                for (index,subJson):(String, JSON) in userJSON  {
                    let firstName = subJson["first_name"].string
                    let lastName = subJson["last_name"].string
                    let user = User(firstName: firstName!, lastName: lastName!)
                    self.users.append(user)

                }
            } else {
                print("Could not get results")
            }
        }
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return users.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "userCell", for: indexPath)
        let user = users[indexPath.row]
        cell.textLabel?.text = "\(user.firstName) \(user.lastName)"

        return cell
    }
}

1 个答案:

答案 0 :(得分:0)

首先,您需要一个结构来保存数据

struct User {
    var firstName: String
    var lastName: String
}

然后,您需要一个数组来容纳json消息中的用户,并将其声明为视图控制器中的属性

var users = [User]()

然后在您的代码中使用它

func getUsers() {
    Alamofire.request(serviceURL, method: .get).validate().responseJSON { (response) in
        if response.result.isSuccess {
            let userJSON : JSON = JSON(response.result.value!)

            for (index,subJson):(String, JSON) in userJSON  {
                let firstName = subJson["first_name"].string 
                let lastName = subJson["last_name"].string
                let user = User(firstName: firstName, lastName: lastName)
                users.append(user)
            }
        } else {
            print("Could not get results")
        }
    }
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
   return users.count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "userCell", for: indexPath)
    let user = users[indexPath.row]
    cell.textLabel?.text = "\(user.firstName) \(user.lastName)"

    return cell
}