我只是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!)
答案 0 :(得分:1)
这种安排在其他人看来可能很笨拙
简单但不可扩展(当然是标准的学习者方法)
我想我可以制作大量的CounterClass对象
这并不能真正解决原始问题。你需要考虑识别和收藏。你当前有someOtherMethod
没有识别计时器的参数的地方 - 这是一个问题(可能你有很多这些方法,每个方法都有相似的名字,可以作用于每个不同的计时器)。 ..
目前尚不清楚increment
的用途是什么,所以我假设你的CounterClass
保持一个递增的瞬态计数。
首先,目前每个计时器有2个类:TimerSettings
(请注意,我更改了名称以遵循约定)和CounterClass
。你真的不需要2个班级。 TimerSettings
是一个非常好的类,可以保存瞬态信息并有其他方法(您可能需要查看mogenerator来帮助解决这个问题。)
所以,我放弃CounterClass
并使用TimerSettings
(可能只将其重命名为MYTimer
,其中MY
是您的项目前缀 - 您应该拥有它所有课程......)
现在,您的每个MYTimer
实体都有一个name
,可用于向用户显示计时器,以便他们可以启动和停止它们(如果用户没有将它们命名为唯一的)然后你就可以玩得开心,你应该添加一些正确的唯一标识符,或使用NSManagedObjectID
)。
请注意,您不需要进行任何迭代或过滤,因为:
MYTimer
MYTimer
为值的本地缓存字典)现在您的对象已被正确识别并且您的方法已参数化,您可以使用更少的代码和更大的“导航”数据结构来查找所需的计时器以处理任何特定用例。