我有一个 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。