我一直在使用singleton与firebase进行交互,类似于以下类。我发现singleton非常方便,所以在我开始使用它之前,我希望能够更深入地了解它。在线课程的一名讲师提到我必须非常小心使用单身人士,但他并没有真正解释原因。我想知道如何正确使用它,为什么我需要非常小心地使用它们?
class DataService {
static let dataService = DataService()
private var _BASE_REF = Firebase(url: "\(BASE_URL)")
private var _USER_REF = Firebase(url: "\(BASE_URL)/users")
private var _JOKE_REF = Firebase(url: "\(BASE_URL)/jokes")
var BASE_REF: Firebase {
return _BASE_REF
}
var USER_REF: Firebase {
return _USER_REF
}
var CURRENT_USER_REF: Firebase {
let userID = NSUserDefaults.standardUserDefaults().valueForKey("uid") as! String
let currentUser = Firebase(url: "\(BASE_REF)").childByAppendingPath("users").childByAppendingPath(userID)
return currentUser!
}
var JOKE_REF: Firebase {
return _JOKE_REF
}
另外,我还要创建另一个单例,如下所示(我还没有创建,因为我想先把它理解得更好)。这些“帖子”将由多个VC访问,这就是为什么我想使用单例,以便所有VC都可以访问他们需要的任何数组而不会产生任何冲突。一般来说,这种设置有什么我需要注意的吗?
对不起,这个问题可能有点宽泛。但这个想法是要概述在这些具体例子中使用Singleton需要注意什么(内存,分配,时间??)
class PostService {
static let ps = PostService()
private var _myPosts = [Post]()
private var _otherPeoplesPosts = [Post]()
private var _followingPosts = [Post]()
var myPosts: [Post] {
return _myPosts
}
var otherPeoplesPosts: [Post] {
return _otherPeoplesPosts
}
var followingPosts: [Post] {
return _followingPosts
}
答案 0 :(得分:0)
据我所知,关于单身人士的唯一主要问题是,无论你是否使用它们,它们都会留在记忆中。
你的第一个单例看起来很容易被带有静态函数的结构替换。
正如其中一条评论中所提到的,使用某种存储(即CoreData)会更好,因为对象不在堆中(至少不是全部)。 如果你的数组由几十个对象组成,它不应该是一个问题,但想象每个数组都有数百个对象。 当然,它可以在应用程序的任何地方访问,但缺点是你的内存使用率会非常高。
如果您没有使用CoreData,并且将它集成到您的项目中会成为一个问题,请考虑将数据存储到文档文件夹中并限制内存中的对象数量以及何时你需要访问一个不在数组中的对象,从documents文件夹中加载它并替换最后使用的对象(有点像CoreData那样)。它并不理想,需要一些强烈的逻辑,但它比堆中有太多的对象并导致内存警告要好。
底线,取决于数据的用途和大小。
希望它在某种程度上有所帮助。