gpt4 book ai didi

ios - Firebase 观察者架构

转载 作者:行者123 更新时间:2023-11-30 11:36:36 25 4
gpt4 key购买 nike

好的,我正在尝试构建一个依赖 Firebase 的 iOS 应用(与其 Android 版本配合使用)

我首先为应用程序中的每个参与者创建一个存储库,并创建一个通用存储库来管理它们

enter image description here

每个存储库都管理该参与者的观察者。一个例子:

在 PagesRepository 中,这是一个从 Firebase 检索所有页面并将其返回到completionHandler 中的函数:

//MARK: Gets the whole pages list
func getPagesList(completionHandler: @escaping (_ pages: [Page]?, _ error: NSError?) -> Void) {

func displayError(error: String) {
print(error)
completionHandler(nil, self.getErrorFromString(error))
}

pagesRef.observe(DataEventType.value) { pagesSnapshot in

guard pagesSnapshot.exists() else {
displayError(error: "Pages snapshot doesn't exist")
return
}

var pagesList = [Page]()
for pageSnapshot in pagesSnapshot.children {
pagesList.append(Page(snapshot: pageSnapshot as! DataSnapshot))
}
completionHandler(pagesList, nil)
}
}

然后我从 ViewController 中调用它,如下所示:

repository.getPagesList { (pages, error) in
guard error == nil else {
return
}

//Do processing
}

我知道这可能需要考虑很多,但是我的问题是,每次我调用该函数时,它都会创建一个新的观察者,但不会取消旧的观察者......所以,completionHandler 是使用不同的值多次调用

我应该如何解决这个问题?(抱歉,有点复杂,有点不清楚,我真的迷路了)

最佳答案

看来您只想观察该值一次,所以我会使用它:

func getPagesList(completionHandler: @escaping (_ pages: [Page]?, _ error: NSError?) -> Void) {

func displayError(error: String) {
print(error)
completionHandler(nil, self.getErrorFromString(error))
}

pagesRef.observeSingleEvent(of: .value, with: { (pagesSnapshot) in
var pagesList = [Page]()

for pageSnapshot in pagesSnapshot.children {
pagesList.append(Page(snapshot: pageSnapshot as! DataSnapshot))
}

completionHandler(pagesList, nil)

}) { (error) in
// Display error
}
}

关于ios - Firebase 观察者架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49699299/

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