由于数据冗余,我需要为我的 iOS 应用重新组织解决方案

I need to reorganize my solution for my iOS app due to redundant data

当我有 3 个相同的副本时,我意识到我没有正确处理这个问题 object,所以我需要一些指导来构建这个问题。我现在会尽力解释这个模型。为简单起见 VC = View Controller


Tl;博士:

MainVC -> MapVC -> DetailsVC <- FavoritesVC
 Tab1                              Tab2

MyClass objects consist of a 'favorite' bool flag and a unique id String
MainVC makes array of MyClass, gives array to MapVC after construction
MapVC constructs dict mapping Pins to MyClass, user selects pin, corresponding 
    MyClass sent to DetailsVC in segue
DetailsVC gets copy of MyClass object, displays its details, can mark as favorite
Since marking as favorite occurs on the copied object, MapVC doesn't realize it's
    marked as favorite

它从 MainVC 开始。它有一个容器视图,它在 MapVC 和 TableVC 之间切换(我们将重点关注 MapVC)。 MainVC 使用 XML 解析器 object 对响应进行排序并创建自定义 MyClass objects 并将它们附加到

myList //(an array of MyClass)

MapVC还有一个名为mapList的MyClass数组。当 MainVC 完成更新 myList 时,它还会设置

mapPage.mapList = myList

MapVC 也有一个将 Pins 映射到 MyClass 的字典,这样当用户 selects 一个 pin 我可以看到它对应于哪个 MyClass。

地图将 selected MyClass 发送到 DetailsVC 这样的 segue

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if let dest = segue.destinationViewController as? DetailsTableViewController{
        dest.myobject = mapList[selectedRow]
        // selectedRow is correctly set elsewhere, no bugs
    }
}

DetailsVC(它只知道单个 selected myObject)显示传递的(或更确切地说是复制的)object的细节。然后您可以将其标记为收藏,这会将 object 的收藏标志设置为 true。为了保存收藏夹,我将已标记为收藏夹的 MyClass object 的字典存储到 UserDefaults。我使用字典而不是数组,这样我就可以在用户取消收藏时查找并删除 myObjects

var faveArray = [String : MyClass]()
    if let unarchivedObject = NSUserDefaults.standardUserDefaults().objectForKey(Constants.PreferenceKeys.favorites) as? NSData {
        faveArray = NSKeyedUnarchiver.unarchiveObjectWithData(unarchivedObject) as! [String : MyClass]
    }
    if isFavorite{
        faveArray[myobject.id] = myobject
    }
    else{
        faveArray.removeValueForKey(myobject.id)
    }
    defaults.setObject(NSKeyedArchiver.archivedDataWithRootObject(faveArray as NSDictionary), forKey: Constants.PreferenceKeys.favorites)

FavoritesVC 加载 UserDefault 字典并在 table 视图中显示每个 myObject。您还可以在此处 select 一个 myObject,它将继续到相同的 DetailsVC,在那里它们可以连续 unfavorite/refavorite(最喜欢的按钮会立即更新,所以如果您喜欢它,它就会变成不喜欢的) .

问题 是当他们从收藏夹VC 中取消收藏某些内容时,它是与地图中的 MyClass object 不同的副本 object =60=](相同的 object,不同的副本),所以当您返回地图时它仍然显示 "Unfavorite"。更广泛的问题是我有 3 个相同的 MyClass 列表、2 个字典和相同 MyClass object 的 3 个副本(MapVC 中有 1 个,ListVC 中有 1 个,ListVC 中有 1 个收藏夹VC),我意识到这不好

我正在考虑将所有数据 object 移动到静态 class(这甚至可能吗?)以便所有控制器都可以访问相同的 MyClass 数组和 object秒。有更好的或标准的方法吗?

你要的是单例。这是一个 class 的实例,初始化一次,访问时是同一个实例(存储在同一个内存块中,相当于一个静态实例)。有多种单例模式,正如我在评论中提到的,如果你不想接受我的回答而只是询问 Swift 中的单例,那没关系!这是一个悬而未决的问题。这是我使用的单例模式的示例,对于 MyClass,class:

private let mySingleton = MyClass()

class MyClass {

    class var shared : MyClass {
        return mySingleton
    }
}

当然可以向此 class 添加属性等。要在任何 VC 中访问此 class 的相同实例,请使用以下代码:

let globalMyClass = MyClass.shared

就是这样!显然,将您的 class 和 var 命名为任何您喜欢的名称。同样,Swift 中还有另一种可靠的全局变量方法。暂时使用它,但有空时学习。祝你好运!