如何在多个视图控制器上更新类的单个实例?

时间:2014-11-10 15:25:18

标签: ios objective-c xcode oop

早上好,

我设计了一个用于进行调查的应用程序。用户将打开该应用程序,创建一个" New"调查,回答相关问题,然后收到一些输出。

这项调查相当令人费解。基本上,这个人将回答关于他们每个家庭成员的同一系列问题。问题完成后,用户将允许应用程序获取所有信息并执行一定数量的计算并返回结果。

我有一个名为" Survey,"其中包含用户基本信息(名称,电子邮件地址等)的属性。我还有一个名为" indQuestions,"其中包含需要为每个家庭成员设置值的属性(每个成员都有一个身高,体重,DOB,收入等)。根据系列的大小,Survey实例将包含任意数量的" indQuestions。"

现在,我必须在创建新调查时创建一个Survey实例,但Survey的实例必须包含X个实例的indQuestions,并且需要根据用户是否需要创建多个调查无论出于何种原因,进行第二次调查,更改答案以比较返回值等。

我的应用程序包含许多UIViewControllers,因为调查很长并且并非一切都可以放在一个页面上,但调查是累积的,它要求我能够访问在以前的UIViewControllers中输入的每个UIViewController的信息。

我考虑过创建我的Survey类的Singleton实例,但最终必须有多个Survey实例,因为客户可能会选择多次进行调查。此外,客户必须能够添加未知数量的" indQuestions"以适应家庭的规模。我一直在试图弄清楚如何找到一种方法,既可以在多个视图中使用Survey(及其相关值)的单个实例,同时还允许动态创建多个家庭成员。

我很感激您提供的任何指导。我不知道如何取得进展。

跟进: 好的,所以我假设我使用以下实例创建一个新的调查?

+ (instancetype)startNewSurvey {
  static Survey *_instance;
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
    _instance = [[Survey alloc] init];
  });
  return _instance;
}
@end

然后我会使用activateSurvey方法将startNewSurvey实例传递给activeSurvey吗?我试图遵循逻辑。

1 个答案:

答案 0 :(得分:2)

听起来你可以真正受益于为你的Survey使用sqlite数据库,但如果它太多工作或者远离你的应用程序设计,你可以使用这种策略:

@interface Survey : NSObject
+ (instancetype)startNewSurvey;
+ (instancetype)activeSurvey;
+ (NSArray *)allSurveys;
+ (void)removeSurvey:(Survey *)survey;
+ (void)activateSurvey:(Survey *)survey;

@property (strong) NSMutableArray *indQuestionsObjects;
@end

它允许您有效地拥有单例,但同时跟踪多个实例。粗略实施如下:

@implementation Survey
static Survey *__activeSurvey = nil;
static NSMutableArray *__allSurveys = nil;
+ (instancetype)startNewSurvey {
  if (!__allSurveys) {
    __allSurveys = [[NSMutableArray alloc] init];
  }
  Survey *survey = [[Survey alloc] init];
  [__allSurveys addObject:survey];
  return survey;
}
+ (instancetype)activeSurvey {
  if (!__activeSurvey) {
    __activeSurvey = [self startNewSurvey];
  }
  return __activeSurvey;
}
+ (NSArray *)allSurveys {
  return __allSurveys;
}
+ (void)removeSurvey:(Survey *)survey {
  if (survey) {
    [__allSurveys removeObject:survey];
  }
}
+ (void)activateSurvey:(Survey *)survey {
  __activeSurvey = survey;
}

- (instancetype)init {
  if (self = [super init]) {
    _indQuestionsObjects = [[NSMutableArray alloc] init];
  }
  return self;
}
@end
相关问题