iOS:数据文件的单例模式

iOS:数据文件的单例模式,ios,singleton,Ios,Singleton,类名MyData有75个以上的属性,这些属性在7个场景中都是必需的 目前,我通过MyData文件的实例传递以下代码: 在SceneOne中: MyData *myData = [[MyData alloc]init]; -(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { UIViewController *destinationViewController = segue.destinationV

类名MyData有75个以上的属性,这些属性在7个场景中都是必需的

目前,我通过MyData文件的实例传递以下代码:

在SceneOne中:

MyData *myData = [[MyData alloc]init];

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    UIViewController *destinationViewController = segue.destinationViewController;
    SceneTwo *sceneTwo = [destinationViewController isKindOfClass:[SceneTwo class]] ? (SceneTwo*)destinationViewController : nil;
    sceneTwo.myData = self.myData;
}
这允许我访问任何属性,如
myData.anyProperty

当第7个场景被取消时,我将myData设置为NULL,应用程序返回到SceneOne,myData的一个新实例被初始化

我正试图通过sharedInstance实现上述目标

MyData.h

#import <foundation/Foundation.h>

@interface MyData : NSObject {

@property (nonatomic, retain) NSString *someProperty;
// 74 other properties

+ (id)sharedData;

@end
问题1:在任何场景中,上面的代码是否可以使用下面的代码访问同一实例:

 MyData *myData = [MyData sharedData];
问题2:我仍然可以以
myData.anyProperty
的身份访问文件吗

问题3:如何触发MyData的新实例并删除当前实例

问题4:我正在从网上下载一个myData文件,它是myData类的副本,但属性包含数据,我希望Singelton提供一个新实例,其中包含下载文件中的数据,代码是什么<代码>即myData=[新下载的文件副本]

问题5:与我目前的方法相比,使用单例方法是否有优势

  • 你没有。你为什么认为这是必要的?您可以改为向MyData添加
    reset
    方法吗
  • 您不应该将单例模式与多实例用例混用。如果你真的想要一个单件,可以考虑在你的数据集中增加一个额外的层。例如,您可能有本地数据远程数据配置。如果这是您想要的,您可能必须更改MyData的接口(标题)才能实现这一点
  • singleton是跨进程的类的单个实例。当您希望从代码中的多个位置访问相同的数据集合时,单例对象是实现这一点的一种方法。否则,您需要实例化一个对象并将其地址传递给所有感兴趣的类,以便它们各自访问同一实例。这太简单了,但我相信它解决了你的问题
  • 关于你对第3条的评论,如果你有一个单身者,如果你不再需要在一个地方的数据,你就不想重置整个应用程序的数据。所以考虑一下会产生什么样的影响。如果不再需要MyData对象,就不要再使用它。单例对象通常会在应用程序的生命周期内持续存在,因此释放/处置该对象并不常见

    对于数字4,假设您当前有一个名为
    player
    的属性,其方法声明如下:

    - (Player *)currentPlayer;
    
    - (Player *)currentPlayerForConfiguration:(NSInteger)configuration;
    
    - (Player *)currentPlayerUsingLocalData:(BOOL)useLocalData;
    
    如果您有多个可用配置,您将向方法接口和实现添加一个参数,如下所示:

    - (Player *)currentPlayer;
    
    - (Player *)currentPlayerForConfiguration:(NSInteger)configuration;
    
    - (Player *)currentPlayerUsingLocalData:(BOOL)useLocalData;
    
    您可以决定使用数字、字符串或其他东西来区分数据的不同配置。如果使用数字,0可以是本地的,1可以是远程的,2可以是任意一个(例如,首先检查本地数据,如果没有,则检查远程数据)。如果只有两个选项,则可以使用
    BOOL
    并如下定义方法:

    - (Player *)currentPlayer;
    
    - (Player *)currentPlayerForConfiguration:(NSInteger)configuration;
    
    - (Player *)currentPlayerUsingLocalData:(BOOL)useLocalData;
    

    非常感谢。三个人。在场景7的末尾,当用户完成该过程时,我不再需要myData文件中包含的数据。那么,您是否建议我添加一个重置方法并手动设置myData.property=NULL;相反四个人。你能详细说明一下MyData的接口(标题)吗?我更新了我的答案,提供了关于这些方面的更多细节。让我知道这对你是如何起作用的。