ios - 为 IOS 加载数据和单例

标签 ios objective-c swift singleton

我正在制作 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 的引用)

我的问题是...

  1. 我知道使用第一种方法“可能”很好,因为它不是单例,但这实际上是人们在这种情况下使用的方法吗? (它让所有的VC链接在一起。非常困惑)

  2. 单例是解决这个问题的正确方法还是有更好的方法? (请注意,与 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/

相关文章:

php - iOS - 没有推送通知的常见原因是什么

ios - 如何在运行时为 UIBarButtonItem 设置目标和操作

ios - 使用平移手势识别器获得平滑旋转

ios - 有没有更好的方法来展平 NSDictionaries 的 NSArray?

ios - 在不同的 View Controller 上使用 Parse 保存用户信息

objective-c - 如何使用 NSCoding 存储 NSUInteger?

objective-c - 在 Cocoa 中,使用 webview,鼠标悬停时如何在状态栏中显示链接?

Swift:在 Switch 语句中使用比较运算符

swift - 如何将值与 NSdictionary 的相似键合并

ios - .text 实际上对一个值做了什么?