Swift 5-从Google Firebase Cloud函数中获取返回的数据并将其放入数组中



我有一个Google Firebase Cloud函数,它返回一个项目数组。在我的iOS应用程序中,我需要获取返回的数组,并将其附加到Swift代码中的另一个数组中。

以下是迄今为止我在Swift上获得的信息:

struct Item: Identifiable {
let id: UUID
let user: String
let name: String
let icon: String
let latitude: Double
let longitude: Double
init(id: UUID = UUID(), user: String, name: String, icon: String, latitude: Double, longitude: Double) {
self.id = id
self.user = user
self.name = name
self.icon = icon
self.latitude = latitude
self.longitude = longitude
}
}
@State var items = [Item]() // This is the array that I need to put the returned data into.
Functions.functions().httpsCallable("getItems").call() { result, error in
// This is where I'm stuck. I need to put the items from the result into the items array.
}

结果是什么?。数据等于:

Optional({
items =     (
{
icon = snow;
latitude = "39.13113";
longitude = "-84.518387";
name = Clothing;
user = tS7T8ATGCLTZOXi3ZGr0iaWWJAf1;
},
{
icon = eyeglasses;
latitude = "37.785834";
longitude = "-122.406417";
name = Glasses;
user = tS7T8ATGCLTZOXi3ZGr0iaWWJAf1;
},
{
icon = "wallet.pass";
latitude = "37.785834";
longitude = "-122.406417";
name = Wallet;
user = tS7T8ATGCLTZOXi3ZGr0iaWWJAf1;
},
{
icon = key;
latitude = "37.785834";
longitude = "-122.406417";
name = Keys;
user = tS7T8ATGCLTZOXi3ZGr0iaWWJAf1;
},
{
icon = laptopcomputer;
latitude = "37.785834";
longitude = "-122.406417";
name = "Laptop/Tablet";
user = tS7T8ATGCLTZOXi3ZGr0iaWWJAf1;
},
{
icon = iphone;
latitude = "37.785834";
longitude = "-122.406417";
name = Phone;
user = tS7T8ATGCLTZOXi3ZGr0iaWWJAf1;
}
);
})

Firebase功能:

exports.getItems = functions.https.onCall(async (data, context) => {
let resultMessage;
let items = [];
if (context.auth.uid) {
const itemsRef = db.collection('items');
const itemsRes = await itemsRef.orderBy('timestamp', 'desc').limit(255).get();
if (!itemsRes.empty) {
itemsRes.forEach(itemDoc => {
const item = {
user: itemDoc.data().user,
name: itemDoc.data().name,
icon: itemDoc.data().icon,
latitude: itemDoc.data().latitude,
longitude: itemDoc.data().longitude
}
items.push(item);
});
resultMessage = "Successfully got the items.";
} else {
resultMessage = "Failed to get the items because there are no items to get.";
}
} else {
resultMessage = "Failed to get the items because the user does not have an ID.";
}
functions.logger.log(resultMessage);
return {
items: items
};
});

我觉得这应该非常容易,但对斯威夫特来说还是个新手。我阅读了Google Firebase的文档,发现了如何获得单个变量而不是数组。我也一直在互联网上搜索,但没有找到解决方案。任何帮助都将不胜感激!!

要直接回答您的问题,您的云函数将返回一个本地JavaScript对象,您需要将其正确转换为本地Swift对象。您的cloud函数实际上返回一个";字典";(JavaScript中的Object(,它只包含一个数组,所以我会放弃这个模式,只返回数组(否则你必须在客户端上再次解压缩它,这是多余的(。因此,在您的云函数中,只需返回数组:

return items;

这个数组将在Swift客户端的结果的data属性中打包为NSArray。因此,请简单地按原样铸造。然后,该数组中的每个项都打包为NSDictionary,您可以将其视为Swift[String: Any]字典。

Functions.functions().httpsCallable("getItems").call() { result, error in
// Cast your data as an array of Any
guard let items = result?.data as? [Any] else {
if let error = error {
print(error)
}
return // forgot to add this!
}
// Iterate through your array and cast each iteration as a [String: Any] dictionary
for item in items {
if let item = item as? [String: Any],
let name = item["name"] as? String,
let user = item["user"] as? String,
let icon = item["icon"] as? String,
let latitude = item["latitude"] as? Double,
let longitude = item["longitude"] as? Double {
print(name)
let item = Item(name: name...) // instantiate
items.append(item) // append
}
}
}

解析这些数据的方法更有吸引力。您可以映射数组,在循环中集成类型转换,使用Firestore的SwiftUI API,这只是几行代码,等等

然而,如果您坚持要返回一个";字典";从云函数中,然后只需修改客户端上的guard语句,并适当地转换它:

guard let items = result?.data as? [String: Any] else {
return
}

然后从字典中获取items值,该值的类型为[Any],您就可以开始比赛了。

最后一件事,在服务器端,我会考虑使用try-catch块来处理错误,因为您已经在使用async-await模式,我认为这是一个好主意。请记住,必须通过返回Promise或抛出Firebase特定的HTTPS错误来终止这些云功能。你没有在你的云函数中做任何错误处理,我认为这是有问题的。

相关内容

  • 没有找到相关文章

最新更新