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

时间:2017-02-02 17:25:18

标签: ios swift object-oriented-analysis

我意识到当我有3个相同对象的副本时,我没有正确接近这个,所以我需要一些指导来构建这个问题。我现在会尽力解释这个模型。为简单起见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解析器对象对响应进行排序并创建自定义MyClass对象并将它们附加到

myList //(an array of MyClass)

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

mapPage.mapList = myList

MapVC还有一个将Pins映射到MyClass的字典,因此当用户选择一个pin时,我可以看到它对应的MyClass。

地图将所选的MyClass发送到segue中的DetailsVC

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 (只知道单个选定的myObject)显示已传递(或相当复制)的对象的详细信息。然后,您可以将其标记为收藏夹,将对象的收藏标记设置为true。为了保存收藏夹,我存储了一个已被标记为UserDefaults收藏夹的MyClass对象的字典。我使用字典而不是数组,因此当用户不喜欢它时我可以查找并删除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字典并在表格视图中显示每个myObject。你也可以在这里选择一个myObject,它会转移到相同的DetailsVC,在那里他们可以不断地/不喜欢(最喜欢的按钮立即更新,所以如果你喜欢,它会变成不喜欢的。)

问题是当他们不喜欢来自FavoritesVC的东西时,它是一个不同的副本MyClass对象,而不是坐在MapVC中的对象(相同的对象,不同的副本),所以当你去回到地图上,它仍然表示&#34;不喜欢&#34;。更广泛的问题是我有3个相同的MyClass列表,2个字典和3个相同的MyClass对象(MapVC中1个,ListVC中1个,FavoritesVC中1个)并且我意识到这不是很好

我想将所有数据对象移动到静态类(甚至可能吗?),以便所有控制器都可以访问相同的MyClass数组和对象。有更好的标准方法吗?

1 个答案:

答案 0 :(得分:0)

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

private let mySingleton = MyClass()

class MyClass {

    class var shared : MyClass {
        return mySingleton
    }
}

当然,向这个班级添加属性等等。要在任何VC中访问此类的SAME实例,请使用以下代码:

let globalMyClass = MyClass.shared

那就是它!显然,无论你喜欢什么,都要为你的班级命名。再一次,Swift的全球变量还有另一种可靠的方法。暂时使用它,但在有空的时候学习。祝你好运!