簡體   English   中英

Alamofire回調永遠不會返回

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM