我有一個iPad應用程序,它連續記錄手指位置(每秒多達30次),如果它在屏幕上並將「樣本」對象保存到每個數據集的核心數據記錄。過了一段時間,也許兩三分鐘,這個過程或至少用戶的反饋變得非常慢。如果我關閉應用程序並重新啓動,它從一開始就很慢,但刪除持久存儲區有助於恢復其原始性能。因此我認爲這個問題應該與數據存儲有關。使用一對多關係的CoreData性能
我試圖用時間分析器來檢測問題,但大部分時間都是由系統庫和非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。
您是否在每個樣品之後保存?是在這3分鐘內爲同一個「Track」完成的樣本? –
是的,當我爲了一個「軌道」而需要很多「樣本」時,速度會變慢。如果我爲另一個「音軌」錄製某些內容,它會很快開始並在一段時間後放慢速度。錄製時我沒有做任何明確的保存,只是在最後。 我想知道如果在關係中添加一個'Sample'會花費很多時間,因爲集合越來越大,每次添加內容時都必須在後臺複製。這對於與'參與者'(='whoListened')的其他關係來說是有意義的,因爲我往往會經常改變這個數量。 – user2953959