swift - 从 Alamofire 请求返回一个 Int

标签 swift alamofire

我尝试使用其他一些 Alamofire 问题的答案,但没有成功。我试图返回一个 int 来初始化 tableView 中的单元格数。

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    var numberOfItems: Int = 0

    MyAPI.RecentTransactions() {
        (items, error) in
        if items! != [] {
            numberOfItems = items!.count
        }
    }

    return numberOfItems
}

我调用的方法是:

class func RecentTransactions(completionHandler: ([Item]?, NSError?) -> ()) -> () {
    var allItems: [Item] = []
    Alamofire.request(.GET, my_url)
        .responseJSON { (request, response, jsonData, error) in

        let json = JSON(jsonData!)
        let transactions = json["transactions"]
        let transaction = transactions["transaction"]

        for (index: String, action: JSON) in transaction {
            let itemURL = NSURL(string: action["item_url"].string!)
            if let homeItem = self.itemFromJSONObject(action["payment_id"].int!, title: action["title"].string!,itemURL: itemURL!) {

                allItems.append(item)

            }
        }
        completionHandler(allItems, error)
    }
}

最佳答案

一般来说,在numberOfRowsInSection 中进行服务器调用并不是一个好的设计。基本上,您的目标应该是在 viewDidLoad() 中加载数据,将它们作为保存状态的属性,例如:

var items: [Item] = [] {
    didSet {
        self.tableView.reloadData()
    }
}

在完成对服务器的调用后,将数据设置为新值,tableView 将自动重新加载。您使用 Alamofire 的方法可能如下所示:

// as you initialize the array, it will never be nil, so no need for optional
class func RecentTransactions(completionHandler: ([Item], NSError?) -> Void) {
    var allItems: [Item] = []
    Alamofire.request(.GET, my_url)
    .responseJSON { (request, response, jsonData, error) in

        let json = JSON(jsonData!)
        let transactions = json["transactions"]
        let transaction = transactions["transaction"]

        for (index: String, action: JSON) in transaction {
            let itemURL = NSURL(string: action["item_url"].string!)
            if let homeItem = self.itemFromJSONObject(action["payment_id"].int!, title: action["title"].string!,itemURL: itemURL!) {

                allItems.append(item)

            }
        }
        completionHandler(allItems, error)
    }
}

不需要有不需要的返回类型,因为它是异步的。

然后你会在你的 viewDidLoad() 中调用这个方法,如下所示:

MyAPI.RecentTransactions() {
    (items, error) in
    self.items = items
}

最后,您的 numberOfRowsInSection 方法如下:

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

这种方法更简洁。对不起,如果我在使用您的私有(private) API 时出错,我无法真正测试代码。

关于swift - 从 Alamofire 请求返回一个 Int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31250618/

相关文章:

ios - 类型 'NSPredicate has no subscript members'

swift - 如何在类型化为协议(protocol)的 Swift 通用数据结构中使用弱引用?

php - 为什么我的 php json_encode 不能在 alamofire 中使用 .responseJSON 序列化?

ios - Alamofire - 多部分表单数据 key :value

Swift TableView 对图像发出多个网络请求

ios - Alamofire - Swift 编译器错误 - 使用未声明的类型

ios - 使用 SwiftyJSON 的未解析标识符 JSON

ios - UIButton Round Corner 在 iPhone 5 上无法正常工作

ios - 如何同步多个 Alamofire 请求

swift - 如何检索谷歌地图中的缩放级别?