从 Alamofire 请求返回一个 Int
Returning an Int from Alamofire Request
我试过在其他一些 Alamofire 问题中使用答案,但没有成功。我正在尝试 return 一个 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)
}
}
不需要不需要的 return 类型,因为它是异步的。
然后你会在你的 viewDidLoad()
中调用这个方法,像这样:
MyAPI.RecentTransactions() {
(items, error) in
self.items = items
}
终于有了这样的 numberOfRowsInSection
方法:
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.items.count
}
这种方法更简洁。对不起,如果我对你的私有 API 有误,我无法真正测试代码。
我试过在其他一些 Alamofire 问题中使用答案,但没有成功。我正在尝试 return 一个 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)
}
}
不需要不需要的 return 类型,因为它是异步的。
然后你会在你的 viewDidLoad()
中调用这个方法,像这样:
MyAPI.RecentTransactions() {
(items, error) in
self.items = items
}
终于有了这样的 numberOfRowsInSection
方法:
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.items.count
}
这种方法更简洁。对不起,如果我对你的私有 API 有误,我无法真正测试代码。