Swift ios alamofire 数据在 viewDidLoad 中第一次返回空
Swift ios alamofire data returning empty first time in viewDidLoad
我正在尝试将数据从 API 加载到我的 viewcontroller 但第一次加载数据时 returns 为空
import UIKit
class AdViewController: UIViewController {
var adId: Int!
var adInfo: JSON! = []
override func viewDidLoad() {
super.viewDidLoad()
loadAdInfo(String(adId),page: 1)
println(adInfo) // This shows up as empty
}
func loadAdInfo(section: String, page: Int) {
NWService.adsForSection(section, page: page) { (JSON) -> () in
self.adInfo = JSON["ad_data"]
println(self.adInfo) // This shows up with data
}
}
在调用 "println(adInfo)" 之前我是 运行 "loadAdInfo()" 但它仍然显示为一个空数组
adsForSection:
static func adsForSection(section: String, page: Int, response: (JSON) -> ()) {
let urlString = baseURL + ResourcePath.Ads.description + "/" + section
let parameters = [
"page": toString(page),
"client_id": clientID
]
Alamofire.request(.GET, urlString, parameters: parameters).responseJSON { (_, res, data, _) -> Void in
let ads = JSON(data ?? [])
response(ads)
if let responseCode = res {
var statusCode = responseCode.statusCode
println(statusCode)
}
println(ads)
}
}
您的 loadAdInfo
方法是异步的。
与您使用 completionHandler 将 Alamofire 的数据从 adsForSection
获取到 loadInfo
的方式相同,您需要为 loadInfo
创建一个处理程序以便检索异步响应。
像这样:
func loadAdInfo(section: String, page: Int, handler: (JSON) -> ()) {
NWService.adsForSection(section, page: page) { (JSON) -> () in
handler(JSON)
}
}
在你的 viewDidLoad
中:
loadAdInfo(String(adId), page: 1) { handled in
println(handled["ad_data"])
self.adInfo = handled["ad_data"]
}
我正在尝试将数据从 API 加载到我的 viewcontroller 但第一次加载数据时 returns 为空
import UIKit
class AdViewController: UIViewController {
var adId: Int!
var adInfo: JSON! = []
override func viewDidLoad() {
super.viewDidLoad()
loadAdInfo(String(adId),page: 1)
println(adInfo) // This shows up as empty
}
func loadAdInfo(section: String, page: Int) {
NWService.adsForSection(section, page: page) { (JSON) -> () in
self.adInfo = JSON["ad_data"]
println(self.adInfo) // This shows up with data
}
}
在调用 "println(adInfo)" 之前我是 运行 "loadAdInfo()" 但它仍然显示为一个空数组
adsForSection:
static func adsForSection(section: String, page: Int, response: (JSON) -> ()) {
let urlString = baseURL + ResourcePath.Ads.description + "/" + section
let parameters = [
"page": toString(page),
"client_id": clientID
]
Alamofire.request(.GET, urlString, parameters: parameters).responseJSON { (_, res, data, _) -> Void in
let ads = JSON(data ?? [])
response(ads)
if let responseCode = res {
var statusCode = responseCode.statusCode
println(statusCode)
}
println(ads)
}
}
您的 loadAdInfo
方法是异步的。
与您使用 completionHandler 将 Alamofire 的数据从 adsForSection
获取到 loadInfo
的方式相同,您需要为 loadInfo
创建一个处理程序以便检索异步响应。
像这样:
func loadAdInfo(section: String, page: Int, handler: (JSON) -> ()) {
NWService.adsForSection(section, page: page) { (JSON) -> () in
handler(JSON)
}
}
在你的 viewDidLoad
中:
loadAdInfo(String(adId), page: 1) { handled in
println(handled["ad_data"])
self.adInfo = handled["ad_data"]
}