我试图遵守MVC惯例,并将所有网络代码保留在我的应用程序中使用的数据服务类中。在一个屏幕上,我有需要显示的用户名和用户名。更新此函数时,我正在调用此函数:
func grabUserData() -> User {
REF_USERS.child(getCurrentUID()).observeSingleEvent(of: .value) {
(snapshot) in
if let userDict = snapshot.value as? Dictionary<String, String> {
let user = User(
first: userDict["firstName"]!,
last: userDict["lastName"]!,
username: userDict["username"]!
)
return user
}
}
}
但是尝试返回用户时出现错误!它说:
void函数中非预期的非无效返回值。
但是该功能显然不是无效的。那我该怎么办?
您正在将grabUserData
函数 返回值与Firebase 闭包 返回值混淆-前者是User
但后者是Void
;)
您实际上是从此关闭返回的—我现在使用一个 明确的 返回类型来明确说明:
{
(snapshot) -> Void in
if let userDict = snapshot.value as? Dictionary<String,String> {
let user = User(
first: userDict["firstName"]!,
last: userDict["lastName"]!,
username: userDict["username"]!
)
return user
}
}
将其作为最后一个参数传递给observeSingleEvent
Firebase函数。这是一个 非常 常见的错误;)
完成处理程序 。这里的标准模式是通过 完成处理程序 返回 所需的内容。该解决方案很好地模拟了网络请求(例如Firebase数据库调用)的
异步 性质。例如:User
func grabUserData(completion: @escaping (User?) -> Void) {
REF_USERS.child(getCurrentUID()).observeSingleEvent(of: .value) {
(snapshot) in
if let userDict = snapshot.value as? Dictionary<String, String> {
let user = User(
first: userDict["firstName"]!,
last: userDict["lastName"]!,
username: userDict["username"]!
)
completion(user) // Returns user!
} else {
completion(nil) // User not found!
}
}
}
最后,在数据服务 客户端代码中 ,像这样调用它:
grabUserData() {
(user) in
if let user = user {
print("Grabbed user: \(user)")
} else {
print("User not found!")
}
}
问题内容: Web服务正在返回由WSDL定义的对象,该对象为: 当我打印出该对象的类信息时,它显示为: 但我需要将此对象解组为以下类的对象: 我知道响应是正确的,因为我知道如何编组此对象的XML: 打印出: 如何将看到的对象变成我知道的对象? 此外,我在AppEngine上运行,该文件访问受到限制。 谢谢你的帮助 更新 : 我添加了注释,如下所示: 但这没有任何区别。 这与内容是的事实有关吗? 这
问题内容: 我正在转换C api> Java,并且具有以下函数原型。 我想按预期返回状态,以整数形式返回“类型”,以字符串形式返回“值”(不被释放) 从文档中,我发现您创建了两个可以保留返回值的结构。 有人可以帮我做第一个吗? 问题答案: 假设函数声明存在于一个名为header.h的文件中,则可以执行以下操作: 这将隐藏“实数” ,而是替换为在(不可修改的)结构中返回输出参数和调用结果的版本。 (
我是Android的新手。我想在android中创建后台服务来监听在FireStore中创建的新文档。我已经准备好了所有的代码,但是服务一次又一次地启动。 > 你能告诉我该怎么做才能开始服务一次吗。每当我打开应用程序时,它就会显示>>listener附加在控制台中。我希望它只执行一次,并保持它在后台运行。 FireStoreActivityListener.java signup.java
我有下面的,它的返回类型是或。中的响应实体是基于的这些返回类型形成的。 如何: 1。设计以返回不同类型的 2。使根据其接收形成 这是控制器
不过就是创建结构体的时候,根据每个对象的特征赋值不同的属性罢了 // 3.创建一个结构体变量 p1 := Person{"lnj", 33} per.say() p2 := Person{"zs", 18} per.Say()