我正在制作 Instagram 克隆,但我对传递数据的最佳方式有一些疑问。
我有 3 个 post 数组和 3 个 VC,如下所示
myPosts = [Post]()
nearbyPosts = [Post]()
followingPosts = [Post]()
myPostVC
nearbyPostVC
followingPostVC
有趣的是,当我下载附近的一篇帖子时,它恰好是我也在关注的帖子之一。因此,当我下载该文章时,我需要将其放入所有三个数组中,以便它们是相同的引用。这样,如果用户“喜欢”该帖子,它将反射(reflect)在所有三个数组中,因为它们指向同一个帖子。 (如果它们没有相同的引用,并且用户喜欢或对 myPosts 数组中的帖子执行任何类型的操作,我将必须手动循环每个nearearPosts和followingPosts以单独更新他们的“喜欢计数”)
最初,我的代码看起来是这样的
myPost -> Initiated inside myPostVC
nearbyPost -> Initiated inside nearByVC
followingPostVC -> Initiated inside followingPostVC
因此,在 myPostVC 中,我需要创建 approximationVC 和 followPostVC 的实例,以便每次我在 myPostVC 中下载帖子时,我都会循环遍历 approximationVC.nearbyPosts 和 followPostVC.followingPosts 并更新与该帖子具有相同 poast 的任何内容刚刚被下载。我为所有三位风险投资家都这样做。想象一下,如果我有更多 VC,这会变得非常困惑,因为每个 VC 都链接到其他 VC(在我的例子中,三个 VC 作为三个选项卡)
这是我更改为单例的时候...我将 myPosts、nearearPosts 和 followPosts 全部放在单例中,如下所示。这允许三个 VC 断开连接,它们只需要通过调用 PostService.ps.myPosts 之类的方法来访问它们想要访问的任何数组(无需创建对其他 VC 的引用)
我的问题是...
我知道使用第一种方法“可能”很好,因为它不是单例,但这实际上是人们在这种情况下使用的方法吗? (它让所有的VC链接在一起。非常困惑)
单例是解决这个问题的正确方法还是有更好的方法? (请注意,与 Instagram 类似,我实际上不需要将这些帖子存储在手机上以供将来查看,因此没有 coredata?)
class PostService { static let ps = PostService() private var _myPosts = [Post]() private var _nearbyPosts = [Post]() private var _followingPosts = [Post]() var myPosts: [Post] { return _myPosts } var nearbyPosts: [Post] { return _nearbyPosts } var followingPosts: [Post] { return _followingPosts }
最佳答案
有很多方法可以解决这个问题。
在任何 View Controller 之外创建一个新类(例如您的PostService
)来表示您的数据模型。该数据模型类可以是单例。我会将所有帖子放入一个名为 allPosts
的集合(而不是数组)中。使用 Set 而不是数组可以防止任何重复。每个 Post 对象都可以有 bool 变量来指示它是否属于特定子集。这可以根据您的数据进行存储或计算。
然后要访问特定的子集,请在该集合上使用过滤函数,例如:
var allPosts: Set<Post> = ...
var myPosts: [Post] {
return allPosts.filter { $0.isMine }
}
var nearbyPosts: [Post] {
return allPosts.filter { $0.isNearby }
}
这里的优点是没有重复的对象以及每个 View Controller 的共享资源。
注意:由于这是一个集合而不是数组,因此它所包含的项目没有任何顺序。但您始终可以使用 sort() 函数来执行此操作。
关于ios - 为 IOS 加载数据和单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39276225/