Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/93.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
由于数据冗余,我需要重新组织iOS应用程序的解决方案_Ios_Swift_Object Oriented Analysis - Fatal编程技术网

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

由于数据冗余,我需要重新组织iOS应用程序的解决方案,ios,swift,object-oriented-analysis,Ios,Swift,Object Oriented Analysis,当我有3个相同对象的副本时,我意识到我没有正确地处理这个问题,所以我需要一些指导来解决这个问题。我现在会尽力解释这个模型。为简单起见,VC=视图控制器 Tl;博士: MainVC -> MapVC -> DetailsVC <- FavoritesVC Tab1 Tab2 MyClass objects consist of a 'favorite' bool flag and a unique id String

当我有3个相同对象的副本时,我意识到我没有正确地处理这个问题,所以我需要一些指导来解决这个问题。我现在会尽力解释这个模型。为简单起见,VC=视图控制器


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
MapVC还有一个名为mapList的MyClass数组。当MainVC更新myList时,它也会设置

mapPage.mapList = myList
MapVC还有一个字典,可以将pin映射到MyClass,这样当用户选择pin时,我就可以看到它对应的MyClass

映射将所选MyClass以这样的顺序发送到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。为了保存收藏夹,我存储了一个MyClass对象的字典,这些对象已标记为UserDefault的收藏夹。我使用字典而不是数组,这样当用户不喜欢MyObject时,我可以查找并删除它们

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中删除某个内容时,它是一个不同于MapVC中的复制MyClass对象(相同的对象,不同的副本),因此当您返回地图时,它仍然显示“Unvorite”。更广泛的问题是,我有3个相同的MyClass列表、2个字典和3个相同MyClass对象的副本(1个在MapVC中,1个在ListVC中,1个在FavoritesVC中),我意识到这不好


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

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

private let mySingleton = MyClass()

class MyClass {

    class var shared : MyClass {
        return mySingleton
    }
}
添加属性等。。。当然是这个班。要在任何VC中访问此类的同一实例,请使用以下代码:

let globalMyClass = MyClass.shared

就这样!显然,可以随意命名您的类和var。此外,Swift中还有另一种可靠的全球VAR方法。现在就用这个,但有时间的时候要学会。祝你好运

对不起,我有点醉了,这里有很多东西(比你提出这么一个问题应该有的多,否则我就不提了)。您是否在问静态模型在Swift中是否可行?(答案是肯定的)。您是否在问MVVM在Swift中是否可行?(同样是的,但我尽我所能做到的是,我意识到这很重要,谢谢你的反馈。我问在这种特定情况下是否有更好的解决方案,这就是我解释整个情况的原因,所以我的问题是“这是我想到的一种方法。它可行且标准吗?”.有什么方法可以改进这段文本吗?我问的是“文本块”,因为我需要你缩小你想要的范围。我的印象是,你想要一个MyClass的实例,任何需要它的VC都可以使用,这样你就不需要一直传递它。这对吗?基本上是的。我想要一个MyCLA的列表s表示所有已解析的MyClass对象,单个MyClass表示所选对象以查看其详细信息。换句话说,我希望将所有数据处理移动到一个通用位置,而不是跨3个视图控制器,并且控制器可以在一个位置访问/更新数据。好的。您需要的是单个对象。我将添加一个答案;ge不过,一般来说,我建议谷歌搜索“Swift singleton”。我想这会让你得到你需要的答案。MyClass.shared可以由其他类设置,还是只读?我问,因为你已经在代码中将它初始化为私有。你将“私有let”放在类之外,以便在应用程序生成时执行,“mySingleton”将不会被初始化多次。该实例是expos在类var“shared”中编辑,该类是公共的,可以修改。
let globalMyClass = MyClass.shared