我正在Swift 3中构建一个iOS应用程序,它应该与我自己构建的JSON Rest Api进行通信。该应用程序将从Api获得各种内容,但目前我需要它做的是通过握手功能检查Api的可用性。
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
if error != nil {
print(error)
} else {
if let urlContent = data {
do {
let jsonResult = try JSONSerialization.jsonObject(with: urlContent, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSDictionary
if jsonResult["response"] as! String == "Welcome, come in!" {
print("************ RESPONSE IS: ************")
print(jsonResult)
return
} else {
return
}
} catch {
print("************ JSON SERIALIZATION ERROR ************")
}
}
}
}
task.resume()
这是我设置的dataTask,它运行得很好(当我打印jsonResult时,我按照预期得到了#34;欢迎!"消息。问题是我想要我的握手函数返回true或false(如果case为false,我可以发出警告。)当我尝试在if语句中设置返回true或false时,我得到错误:意外的非void返回值在无效功能中。
我的问题是:如何从dataTask中返回数据,以便我可以在握手函数中执行检查?我对Swift很新,所以感谢所有的帮助:)
以下是整个班级:
import Foundation
class RestApiManager: NSObject {
var apiAvailability:Bool?
func handshake() -> Bool {
let url = URL(string: "https://api.restaurapp.nl/handshake.php")!
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
if error != nil {
print(error)
} else {
if let urlContent = data {
do {
let jsonResult = try JSONSerialization.jsonObject(with: urlContent, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSDictionary
if jsonResult["response"] as! String == "Welcome, come in!" {
print("************ RESPONSE IS: ************")
print(jsonResult)
return true
} else {
return false
}
} catch {
print("************ JSON SERIALIZATION ERROR ************")
}
}
}
}
task.resume()
}
}
答案 0 :(得分:0)
由于您使用的是异步API,因此无法从handshake
函数返回bool。如果要在错误情况下显示警报,则应将return false
替换为:
DispatchQueue.main.async {
self.showAlert()
}
从技术上讲,你可以暂停握手功能,直到网络内容完成,并返回bool,但这会失去异步的目的,它会冻结你的应用程序的用户界面在网络活动期间,我怀疑你想做什么。