0

我有一个 iPad 应用程序,如果它在屏幕上,它会连续记录手指位置(每秒最多 30 次),并为记录的每个数据集保存一个“样本”对象到核心数据。一段时间后,可能是两三分钟,这个过程或者至少用户反馈变得非常缓慢。如果我关闭应用程序并重新启动它从一开始就很慢,但删除持久存储有助于使其恢复到原始性能。因此我认为问题应该与数据存储有关。

我试图用时间分析器检测问题,但大部分时间都被系统库和非 Objective-C 代码占用。如果我为分析关闭这些,那么最耗时的方法是初始化示例对象:

@implementation Sample (Create)
+(Sample *)sampleWithTime:(double)time
             xValue:(double)x
             yValue:(double)y
          eventType:(EventType)event
        chillStatus:(BOOL)chill 
        participant:(Participant *)whoListened
              track:(Track *)whichTrack
inManagedObjectContext:(NSManagedObjectContext *)context
{
   Sample *sample; 
   if (!sample) {
    sample = [NSEntityDescription insertNewObjectForEntityForName:@"Sample" inManagedObjectContext:context];
     sample.time = time;
     sample.x = x;
     sample.y = y;
     sample.event = event;
     sample.chillStatus = chill;
     sample.whichTrack = whichTrack;
     sample.whoListened = whoListened;
   }
   return sample;
}

sample.whichTrack = 哪个轨道;建立与方法的轨道对象(ManagedObject 子类,指正在播放的音乐)的关系。这是一个一对多的关系,每个样本只有一个轨道,但每个轨道有很多样本。这条线消耗了整个方法的 87% 的时间,即使下一行正在执行与此相比,几乎不需要任何东西。

在这里搜索问题是否有意义?由于关系中的对象集变得更大并且必须复制以添加对象或类似的东西,数据库会变得那么慢吗?我能做些什么来提高性能吗?作为一个文件的数据库根本没有变大,它仍然小于 1 MB。

4

1 回答 1

1

在那里搜索问题很有意义。

我假设您将您的whichTrack(一对一)关系设置为对象samples上的反向(对多)关系Track

您需要 30Sample秒/秒 ==> 3 分钟的采样时间Track将保持:5400 个对象处于一对多关系中。这种关系在两端都保持,这意味着无论何时插入一个新样本,都必须从存储中获取整个对象集(至少是它们的错误)(如果还没有错误的话)。
如果您在每次新的Sample和释放您的上下文后保存(重置或刷新Track对象)将需要在您下次访问该项目时重新获取对多关系中的所有现有项目Track

我会尝试首先删除反向关系(Track实体的多向关系)并查看它的行为方式。
小心,因为这将消除Track删除(Sample对象)时的任何级联。

如果您仍然需要在删除时进行级联,您可以通过向您的实体添加一个实现来Track自己添加它。prepareForDeletionTrack

另一种解决方案(更优雅)是将您的样本分割成一个SampleContainer对象。
一个Track对象将与 具有一对多关系SampleContainer
每个容器将限制为“N”个样本。
装满容器后,将新容器添加到Track.

除此之外:
您只能在每个“T”时间间隔执行一次保存。这将进一步减少存储访问(保存),但这可能不适合您,因为Sample如果用户在 2 次保存之间终止应用程序(您始终可以在进入后台之前保存),您可能会丢失 s。

于 2013-11-05T17:26:25.743 回答