我正在制作一个Instagram克隆,但我对于传递数据arround的最佳方法有疑问。
我有3个帖子阵列和3个VC,如下所示
myPosts = [Post]()
nearbyPosts = [Post]()
followingPosts = [Post]()
myPostVC
nearbyPostVC
followingPostVC
有趣的是,当我下载附近的帖子时,它恰好是我关注的帖子之一。因此,当我下载该帖子时,我需要将它放在所有三个数组中,因此它们是相同的引用。这样,如果用户“喜欢”该帖子,它将反映在所有三个数组中,因为它们指向同一个帖子。 (如果他们没有相同的引用,并且用户喜欢或对myPosts数组中的帖子执行任何类型的操作,我将不得不手动遍历每个nearPosts和followPosts以单独更新他们的“like count”)
最初,我的代码看起来是
myPost -> Initiated inside myPostVC
nearbyPost -> Initiated inside nearByVC
followingPostVC -> Initiated inside followingPostVC
所以在myPostVC中,我需要创建一个nearVC和followPostVC的实例,这样每次我在myPostVC中下载一个帖子时,我都会遍历nearVC.nearbyPosts和followingPostVC.followingPosts并更新任何与那个具有相同功能的poast。刚刚下载。我为这三个VC做了这个。想象一下,如果我有更多的VC,这会变得非常混乱,因为每个VC链接到其他VC(在我的情况下,三个VC作为三个选项卡)
这是我改为Singleton的时候......我把myPosts,附近的Posts和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
}
答案 0 :(得分:0)
有很多方法可以解决这个问题。
在任何视图控制器之外创建一个新类(例如PostService
)来表示您的数据模型。此数据模型类可以是单例。我会将所有帖子放入名为allPosts
的单个Set(不是数组)中。使用Set而不是数组将防止任何重复。每个Post
对象都可以有布尔变量,指示它是否属于特定子集。这可以根据您的数据进行存储或计算。
然后,要访问特定子集,请使用集合上的过滤器函数,例如:
var allPosts: Set<Post> = ...
var myPosts: [Post] {
return allPosts.filter { $0.isMine }
}
var nearbyPosts: [Post] {
return allPosts.filter { $0.isNearby }
}
此处的优点是不会为每个视图控制器重复对象和共享资源。
注意:由于这是一个Set而不是一个数组,因此它对它包含的项目没有任何顺序。但是你总是可以使用sort()函数来做到这一点。