我一直在相当广泛地使用 singleton 来与 firebase 进行交互,类似于下面的类。我发现单例非常方便,所以我想在开始使用它之前更深入地了解它。在线类(class)的一位讲师提到我在使用单例时必须非常小心,但他并没有真正解释原因。我想知道如何正确使用它以及为什么我需要非常小心地使用它们?
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
}
最佳答案
据我所知,有关单例的唯一主要问题是,无论您是否使用它们,它们都会保留在内存中。
您的第一个单例看起来可以轻松地替换为具有静态函数的结构。
正如其中一条评论中提到的,使用某种存储(即 CoreData)会更好,因为对象不在堆中(至少不是全部)。 如果您的数组由几十个对象组成,那么这应该不是问题,但想象一下每个数组都包含数百个对象。 当然,可以从应用程序中的任何位置访问它,但缺点是内存使用量会非常高。
如果您不使用 CoreData 并且将其集成到您的项目中将会出现问题,请考虑将数据存储到文档文件夹并限制内存中对象的数量以及何时需要访问对象不在数组中,从文档文件夹加载它并替换最后使用的对象(有点像 CoreData 那样)。这并不理想,需要一些密集的逻辑,但它比堆中拥有太多对象并导致内存警告要好。
底线,这取决于数据的使用情况和大小。
希望它能在某种程度上有所帮助。
关于ios - IOS中单例的使用及注意事项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39273445/