如何使用Alamofire发出同步请求?
我正在尝试使用进行同步请求Alamofire。我查看了Stackoverflow并发现了这个问题:使异步alamofire请求成为sync
我看到接受的答案用于completion使Alamofire请求同步,但是我无法使其正常工作。这是我的简化代码:
func loadData(completion: (Bool)) -> (Int, [String], [String], [String]){    Alamofire.request(url!, method: .get, parameters: nil, encoding: JSONEncoding.default, headers: nil).responseJSON { response in
        switch(response.result) {
        case .success(_):
            if let JSON = response.result.value as! [[String : AnyObject]]!{
                 //Here I retrieve the data
            }
            completion(true)
            break
        case .failure(_):
            print("Error")
            completion(false)
            break  
        }
   }
   return (numberRows, nameArray, ageArray, birthdayArray)
}
有了这段代码,我在尝试制作时会出错completion(bool value)。我收到的错误如下:
无法调用非功能类型“布尔”的值
我尝试使用许多使用完成的示例来同步获取值(因为我需要先检索数据才能将其显示在表上,并同时获取该表的行数),但没有成功。
如何使用该完成来获取同步响应?
提前致谢!
回答:
当您使用完成处理程序时,请勿使用return。
func loadData(completion: @escaping (_ number: Int, _ strArr1: [String], _ strArr2: [String], _ strArr3: [String]) -> ()){  Alamofire.request(url!, method: .get, parameters: nil, encoding: JSONEncoding.default, headers: nil).responseJSON { response in
    switch(response.result) {
    case .success(_):
        if let JSON = response.result.value as! [[String : AnyObject]]!{
            //Here I retrieve the data
        }
        completion(number: numberRows, strArr1 : nameArray, strArr2 : ageArray, strArr3: birthdayArray)
        break
    case .failure(_):
        print("Error")
        completion(number: numberRows, strArr1 : nameArray, strArr2 : ageArray, strArr3: birthdayArray)
        break
    }
  }
}
loadData (completion: { (number, strArr1, strArr2, strArr3) in
    // do it
    // for exapmple
    self.number = number
    self.strArr1 = strArr1
    // and so on
})
或者,如果要在闭包中返回任何值,则必须使用完成处理程序来返回任何值或类似的东西,例如,如果要返回布尔值:
func loadData(completion:(number: numberRows, strArr1 : nameArray, strArr2 : ageArray, strArr3: birthdayArray) -> (Bool))并在 loadData
loadData( completion: { ( number, strArr1, strArr2, strArr3 ) -> (Bool) in       # code 
       return False
})
或其他想法。
我使用的是swift3。但是,如果您要使用其他版本的swift,请注意外部参数名称和内部参数名称,例如: @escaping (_ number:Int, _ strArr1: [String], _ strArr2: [String], _ strArr3: [String]) -> ())
如果要设置外部参数名称,只需删除_并设置参数名称即可。
以上是 如何使用Alamofire发出同步请求? 的全部内容, 来源链接: utcz.com/qa/415024.html







