我有一个返回类对象或 nil 的函数。该函数的目的是检查是否Chat
存在。聊天 ID 存储在 MySQL 中。如果 ID 存在,我会执行 Firebase 引用来获取快照,然后获取对象。如果 ID 不存在,则返回 nil:
func findChat(string: String) -> Chat? {
var returnValue: (Chat?)
let url = getChatsURL
let Parameters = [ "title" : string ]
Alamofire.request("\(url)", method: .post, parameters: Parameters).validate().responseString { response in
if let anyResponse = response.result.value {
self.responseFromServer = anyResponse
}
if self.responseFromServer == "" {
returnValue = nil
} else {
let ref = DatabaseReference.chats.reference()
let query = ref.queryOrdered(byChild: "uid").queryEqual(toValue: (self.responseFromServer))
query.observe(.childAdded, with: { snapshot in
returnValue = Chat(dictionary: snapshot.value as! [String : Any])
})
}
return returnValue
}
}
然而,在return returnValue
我正进入(状态
void 函数中出现意外的非 void 返回值。
有什么想法我可能会错过什么吗?
问题是您试图从闭包内部返回一个非 void 值,该值仅从闭包返回,但由于该闭包需要一个 void 返回值,因此您会收到错误。
您无法使用标准从异步函数返回return ...
语法中,您必须声明您的函数以接受完成处理程序并从完成处理程序内的异步网络调用返回值。
func findChat(string: String, completion: @escaping (Chat?)->()) {
var returnValue: (Chat?)
let url = getChatsURL
let Parameters = [ "title" : string ]
Alamofire.request("\(url)", method: .post, parameters: Parameters).validate().responseString { response in
if let anyResponse = response.result.value {
self.responseFromServer = anyResponse
}
if self.responseFromServer == "" {
completion(nil)
} else {
let ref = DatabaseReference.chats.reference()
let query = ref.queryOrdered(byChild: "uid").queryEqual(toValue: (self.responseFromServer))
query.observe(.childAdded, with: { snapshot in
completion(Chat(dictionary: snapshot.value as! [String : Any]))
})
}
}
}
然后你可以调用这个函数并使用返回值,如下所示:
findChat(string: "inputString", completion: { chat in
if let chat = chat {
//use the return value
} else {
//handle nil response
}
})
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)