gpt4 book ai didi

Swift Firebase 在整个应用程序中重用一个函数

转载 作者:行者123 更新时间:2023-11-28 15:11:20 24 4
gpt4 key购买 nike

在我的应用程序中,我在几个地方从 Firebase Firestore 数据库加载数据并显示数据。问题是我没有采用 DRY 技术而且我知道我不应该,但我在我的应用程序的不同位置重复使用了相同的加载函数。

func loadData() {

let user = Auth.auth().currentUser
db.collection("users").document((user?.uid)!).collection("children").getDocuments() {
QuerySnapshot, error in
if let error = error {
print("\(error.localizedDescription)")
} else {
// get all children into an array
self.childArray = QuerySnapshot!.documents.flatMap({Child(dictionary: $0.data())})
DispatchQueue.main.async {
self.childrenTableView.reloadData()
}
}
}
}

该函数只是从数据库中获取所有子元素并将它们添加到我的子元素数组中。

有没有更好的方法来做到这一点,或者我可以把这个函数放在一个中心位置,当我需要它时在应用程序中调用它,而不是在多个 View Controller 中重复添加它?

我想到了一个辅助类,只是调用函数,但不确定如何将结果添加到我需要的 View Controller 中的 childArray?


我的 child 模型

import UIKit
import FirebaseFirestore


protocol DocumentSerializable {
init?(dictionary:[String:Any])
}

// Child Struct
struct Child {

var name: String
var age: Int
var timestamp: Date
var imageURL: String

var dictionary:[String:Any] {
return [
"name":name,
"age":age,
"timestamp":timestamp,
"imageURL":imageURL
]
}

}

//Child Extension
extension Child : DocumentSerializable {
init?(dictionary: [String : Any]) {
guard let name = dictionary["name"] as? String,
let age = dictionary["age"] as? Int,
let imageURL = dictionary["imageURL"] as? String,
let timestamp = dictionary["timestamp"] as? Date else {
return nil
}
self.init(name: name, age: age, timestamp: timestamp, imageURL: imageURL)
}
}

最佳答案

编辑:我已经更新以安全地解包 optional 。您可能仍然需要修改,因为我不确定您的 Firebase 结构是什么,也不知道您的子初始化程序。

你可以把它写成一个静态函数,然后在任何地方重用它。我假设您可能有一些与“ child ”相关的类(class),那将是实现的最佳场所。您可以将结果(作为 Child 的选项数组)传递到完成处理程序中,以便您可以对这些结果执行任何需要的操作。它看起来像这样:

static func loadData(_ completion: (_ children: [Child]?)->()) {

guard let user = Auth.auth().currentUser else { completion(nil); return }
Firestore.firestore().collection("users").document(user.uid).collection("children").getDocuments() {
querySnapshot, error in
if let error = error {
print("\(error.localizedDescription)")
completion(nil)
} else {
guard let snapshot = querySnapshot else { completion(nil); return }
// get all children into an array
let children = snapshot.documents.flatMap({Child(dictionary: $0.data())})
completion(children)
}
}
}

假设您在子类中实现了此功能,您可以像这样使用它:

Child.loadData { (children) in
DispatchQueue.main.async {
if let loadedChildren = children {
//Do whatever you need with the children
self.childArray = loadedChildren
}
}
}

关于Swift Firebase 在整个应用程序中重用一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47581472/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com