我有两个我正在处理的视图控制器,它们都从Base视图控制器继承
这两个VC都与我的firebase数据库进行了很大的交互。所以我想要一个变量来跟踪所有下载的项目,这样两个VC就可以访问它而无需再次重新下载文件。
我试图在BaseViewController中放置一个变量名,以便两个A,B类访问
var allPostsDownloaded: [Post]!
因此,在A_VC下载任何数据之前,它会检查此allPostsDownloaded变量并在数据存在时从中加载。如果它不存在,我追加到这个变量。因此,当切换到B_VC时,可以完成相同的操作,并且在不需要时不会重新下载数据。
我没有使用segue或protocal传递数据的原因是两个VC与我的数据库交互得非常重要。因此,尝试使用可变数据变得更加清晰,以便跟踪事物的位置。
然而,问题在于我
var allPostsDownloaded: [Post]!
每当我在A和B VC(哪些是标签符号)之间切换时,都会调用。这将导致变量为空并取消初始化。
我想我可以使用全局变量,但这不是一个好习惯吗?任何人都可以解释为什么在新标签出现时重新调用它?对此最好的解决方案。
答案 0 :(得分:2)
正如@avi提到的创建新的单例类,然后你可以轻松传递和阅读。以下是一个例子
class PersistentData
{
static let sharedInstance = PersistentData()
// your global persistent variable
var allPostsDownloaded = [Post]()
}
因此,在您的控制器中,您可以简单地阅读和设置如下
// read
print(PersistentData.sharedInstance.allPostsDownloaded)
// set new data. this just example, hence depends on your case
PersistentData.sharedInstance.allPostsDownloaded.append(newPost)
PersistentData.sharedInstance.allPostsDownloaded = posts
另请注意,如果您想在标签之间切换时阅读新值,可以在viewDidAppear
或viewWillAppear
答案 1 :(得分:1)
您可以使用实例变量创建Singleton类,并且可以保存所有下载的数据,并且可以从项目类的任何位置访问singleton类变量。