Почему этот кусок кода такой медленный?(CoreData & NSSet) - PullRequest
1 голос
/ 19 декабря 2010

У меня есть приложение, и я использую полнотекстовый поиск.У меня есть 2 enitites: ключевые слова и статьи с отношениями «многие ко многим».Проблемный фрагмент кода выглядит следующим образом:

            keywordsInRange = [[[CoreDataManager sharedManager] managedObjectContext]  executeFetchRequest:request error:&err];



            for(Keywords* word in keywordsInRange) {
                NSDate *methodStart = [NSDate date];

                [mySet addObjectsFromArray:[word.article allObjects]];

                NSDate *methodFinish = [NSDate date];
                NSTimeInterval executionTime = [methodFinish timeIntervalSinceDate:methodStart];
                NSLog(@"Keyword Search Exec Time: %.3f", executionTime);
            }

вывод такой:

Keyword Search Exec Time: 0.235  //added 1 article
Keyword Search Exec Time: 0.216  //added 6 articles
Keyword Search Exec Time: 0.211  //etc
Keyword Search Exec Time: 0.205
Keyword Search Exec Time: 0.204

, как вы можете видеть, для добавления всех статей, связанных с ключевым словом в наборе, требуется много временивремя, когда я тестирую на устройстве (iPad iOS 4.2.1).Когда я тестирую в симуляторе, время:

0.029
0.026
0.026
0.026
0.026

Где ошибка, что я могу сделать, чтобы ускорить процесс?

Ответы [ 2 ]

0 голосов
/ 19 декабря 2010

Попробуйте позвонить [request setRelationshipKeyPathsForPrefetching:[NSArray arrayWithObject:@"article"]]; до первой строки вашего кода выше.

В противном случае каждая итерация в цикле генерирует новый выбор для статей, хотя вам действительно нужен только один.

В этом случае часто полезно использовать SQLDebug, чтобы увидеть фактические генерируемые операторы SQL. Для этого щелкните правой кнопкой мыши на своем исполняемом файле, выберите «Информация», перейдите на вкладку «Аргументы» и добавьте -com.apple.CoreData.SQLDebug 1 в «Аргументы, которые необходимо передать при запуске».

0 голосов
/ 19 декабря 2010

Я не эксперт CoreData, но разве это не лениво загружать статьи? Если да, это означает, что для каждого ключевого слова выполняется запрос к хранилищу.

...