![](/img/trans.png)
[英]taskWillPerformHTTPRedirection never called in Alamofire 5
[英]Alamofire callback never returns
我正在使用Alamofire庫向stackexchange api發出GET請求,並且要將從JSON獲得的結果保存在數組中,問題是alamofire任務是異步的,我需要它提供的數據我做了諸如表格單元格插入之類的工作嗎...我試圖使用信號量使我的程序等待調用,但調用從未到達signal()。為什么會發生這種情況? 是異步調用終止后繼續工作的另一種方式嗎? 我對這些東西還很陌生,所以我不太了解,不勝感激。 代碼如下:
var users:[UserInfo] = []
var number:Int = 0
let dispatch:DispatchSemaphore = DispatchSemaphore(value: 0)
override func viewDidLoad() {
tableView.delegate = self
tableView.dataSource = self
// GET the data from the stackexchange api
let param: Parameters = [
"order": "desc",
"max" : 10,
"sort" : "reputation",
"site" : "stackoverflow"
]
Alamofire.request("https://api.stackexchange.com/2.2/users", method: .get, parameters: param).responseJSON { (response) -> (Void) in
if let json = response.result.value {
// we got a result
/* I know this is a bit ugly */
let json1 = json as! [String:AnyObject]
let usersInfoFromJSON = json1["items"] as! NSArray // remember to cast it as NSDictionary
for userInfo in usersInfoFromJSON {
self.number = 70 // just for test
let userDict = userInfo as! NSDictionary
self.users.append(UserInfo(newName: userDict["display_name"] as! String,
newImageURL: userDict["profile_image"] as! String))
}
}
self.dispatch.signal()
}
self.dispatch.wait()
print(self.number) // just for test
super.viewDidLoad()
}
首先,擺脫DispatchSemaphore。 您使用它的方式將阻塞主線程。 好主意。
就像從閉包中調用tableView.reloadData()
一樣簡單。 我還建議將數據加載放入一個單獨的函數中,以防您有時想要從源刷新數據。
var users:[UserInfo] = []
var number:Int = 0
override func viewDidLoad() {
tableView.delegate = self
tableView.dataSource = self
loadData()
super.viewDidLoad()
}
func loadData() {
// GET the data from the stackexchange api
let param: Parameters = [
"order": "desc",
"max" : 10,
"sort" : "reputation",
"site" : "stackoverflow"
]
Alamofire.request("https://api.stackexchange.com/2.2/users", method: .get, parameters: param).responseJSON { (response) -> (Void) in
if let json = response.result.value {
// we got a result
/* I know this is a bit ugly */
let json1 = json as! [String:AnyObject]
let usersInfoFromJSON = json1["items"] as! NSArray // remember to cast it as NSDictionary
for userInfo in usersInfoFromJSON {
self.number = 70 // just for test
let userDict = userInfo as! NSDictionary
self.users.append(UserInfo(newName: userDict["display_name"] as! String,
newImageURL: userDict["profile_image"] as! String))
}
}
self.tableView.reloadData()
print(self.number) // just for test
}
}
如果你要弄巧,你甚至可以移動reloadData()成didSet
的封閉users
。 當然,如果執行此操作,請從Alamofire閉包中刪除reloadData()
調用。
var users:[UserInfo] = [] {
didSet {
tableView.reloadData()
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.