核心数据 - 动态(和持久)对象创建和操作

时间:2014-06-28 08:42:07

标签: objective-c class object core-data

我只是Core Data和Objective C的新手,所以我希望这个问题是连贯的。

我一直在研究一个基本上是一组NSTimers的应用程序,这些应用程序反复触发,直到被告知要更改(使用新参数或停止)。每个时序方案都有自己的分配和初始化对象,标题中的方法如下所示:

@interface CounterClass : NSObject

- (void)startCounting:(int)counterIncrement;

- (void)amendCounting:(int)newCounterIncrement;

- (void)stopCounting;

@end

最初,该应用程序的数据结构非常严格,仅限于三个计数器。这使得分配对象并根据需要运行它相当简单。可以在实现的顶部明确命名计数器。因此,我可以分配类,并根据需要在方法中引用它。

@implementation MainClass
{
    // Counter Objects
    CounterClass *counterA;
    CounterClass *counterB;
    CounterClass *counterC;
}

...

- (void)initialisingMethod
{
    counterA = [[CounterClass alloc] init];
    [counterA startCounting:1];
    counterB = [[CounterClass alloc] init];
    [counterB startCounting:2];
    counterC = [[CounterClass alloc] init];
    [counterC startCounting:5];
}

- (void)someOtherMethod
{
    [counterA amendCounting:2];
    [counterB amendCounting:9];
    [counterC amendCounting:4];
}

- (void)stoppingMethod
{
    [counterA stopCounting];
    [counterB stopCounting];
    [counterC stopCounting];
}

这种安排在其他人看来可能很笨拙,但它的效果似乎相当不错。 在initialisingMethod中初始化对象后,对象仍然存在,并且可以在整个程序中根据需要调用方法。

但是,现在我已将Core Data整合到应用程序中,并希望使计时对象组更具动态性。我目前的核心数据方案是一个单一的整体时序组实体,用户必要时会创建一堆定时器:

Entity - timingGroupInfo
Attributes - name, image
Relationships - timers (one to many)

Entity - timerSettings
Attributes - name, increment
Relationships - info (to one)

我想要做的是取消三个CounterClass对象的刚性集合,并且能够处理从1到n的无限数量的计数器,具体取决于Core Data中存在多少个timerSettings条目

我想我可以制作大量的CounterClass对象......:

@implementation MainClass
{
    // Counter Objects
    CounterClass *counterA;
    CounterClass *counterB;
    CounterClass *counterC;
    ...
    CounterClass *counterN;
}

...然后遍历列出的timerSettings并单独分配它们,但这种技术似乎相当粗糙,我想避免的事情。 我更喜欢创建的类数量会随着timerSettings条目的数量而扩展,但我只是不知道如何实现这一点。初始化完成后,对象需要保留,并且稍后需要在someOtherMethod和stoppingMethod中调用这些方法。

此类行为是否有名称/最佳做法?在进行Google搜索时,我无法确定正确的关键字组合。 我猜我需要做的是以某种方式将方法附加到单个NSManagedObject,和/或使用我创建的NSManagedObject Entity类(在本例中为timingGroupInfo.h和timerSettings.h) 。核心数据对我来说是一个新鲜的领域,所以对于有经验的程序员来说,这可能是一个简单的建议。

对我接近这一点的方式持开放态度(我还在学习Objective C!)

1 个答案:

答案 0 :(得分:1)

  

这种安排在其他人看来可能很笨拙

简单但不可扩展(当然是标准的学习者方法)

  

我想我可以制作大量的CounterClass对象

这并不能真正解决原始问题。你需要考虑识别和收藏。你当前有someOtherMethod没有识别计时器的参数的地方 - 这是一个问题(可能你有很多这些方法,每个方法都有相似的名字,可以作用于每个不同的计时器)。 ..

目前尚不清楚increment的用途是什么,所以我假设你的CounterClass保持一个递增的瞬态计数。

首先,目前每个计时器有2个类:TimerSettings(请注意,我更改了名称以遵循约定)和CounterClass。你真的不需要2个班级。 TimerSettings是一个非常好的类,可以保存瞬态信息并有其他方法(您可能需要查看mogenerator来帮助解决这个问题。)

所以,我放弃CounterClass并使用TimerSettings(可能只将其重命名为MYTimer,其中MY是您的项目前缀 - 您应该拥有它所有课程......)

现在,您的每个MYTimer实体都有一个name,可用于向用户显示计时器,以便他们可以启动和停止它们(如果用户没有将它们命名为唯一的)然后你就可以玩得开心,你应该添加一些正确的唯一标识符,或使用NSManagedObjectID)。

请注意,您不需要进行任何迭代或过滤,因为:

  1. 您应该能够唯一地标识每个MYTimer
  2. 所有作用于单个计时器的方法都应该使用该计时器,或将计时器唯一标识符作为参数
  3. 每当您获得要使用的唯一标识符时,您可以询问该计时器的托管对象上下文(或标识符为密钥且MYTimer为值的本地缓存字典)
  4. 现在您的对象已被正确识别并且您的方法已参数化,您可以使用更少的代码和更大的“导航”数据结构来查找所需的计时器以处理任何特定用例。