Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/97.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Alamofire回调永远不会返回_Ios_Swift_Http_Networking - Fatal编程技术网

Ios Alamofire回调永远不会返回

Ios Alamofire回调永远不会返回,ios,swift,http,networking,Ios,Swift,Http,Networking,我正在使用Alamofire库向stackexchange api发出GET请求,我想将从JSON获得的结果保存在一个数组中,问题是alamofire任务是异步的,我需要它提供的数据来完成我的工作,如表单元格插入等。我试图使用信号量让我的程序等待调用,但调用从未到达signal()。为什么会发生这种情况?这是异步调用终止后继续工作的另一种方式吗?我对这东西很陌生,所以我不太了解,非常感谢您的帮助。代码如下: var users:[UserInfo] = [] var number:Int = 0

我正在使用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()
}

首先,去掉Dispatch信号量。您使用它的方式将阻塞主线程。好主意

这可能与从闭包调用
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()
    }
}

首先,去掉Dispatch信号量。您使用它的方式将阻塞主线程。好主意

这可能与从闭包调用
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()
    }
}

你真的不想用self.dispatch.wait()阻塞主线程是的,你是对的,但是解决方案是什么呢?首先,去掉dispatch信号量。在Alamofire.request调用结束时,执行您需要执行的任何操作。在上面的示例中,将
print(self.number)
放在您当前拥有
self.dispatch.signal()的位置。
您可能需要从那里调用以更新UI、停止微调器,无论是什么,这样就可以了,但我还有其他函数,比如TableViewDelegate所需的函数,它们需要alamofire call提供的数据。同样的原则也适用,从闭包调用这些函数。表视图委托只需立即处理没有数据的问题。一旦你有了数据,你可以调用tableview.reloadData()来显示它。你真的不想用self.dispatch.wait()阻塞主线程是的,你是对的,但是解决方案是什么呢?首先,去掉dispatch信号量。在Alamofire.request调用结束时,执行您需要执行的任何操作。在上面的示例中,将
print(self.number)
放在您当前拥有
self.dispatch.signal()的位置。
您可能需要从那里调用以更新UI、停止微调器,无论是什么,这样就可以了,但我还有其他函数,比如TableViewDelegate所需的函数,它们需要alamofire call提供的数据。同样的原则也适用,从闭包调用这些函数。表视图委托只需立即处理没有数据的问题。获得数据后,可以调用tableview.reloadData()来显示它。