몇 가지 테이블 뷰를 지원하는 일련의 NSFetchedResultsController가 있으며 장치에서의 성능은 몇 초 만에 매우 심했습니다. 모든 것이 메인 스레드에서 실행되기 때문에 시작시 내 응용 프로그램을 차단하므로 큰 문제는 아닙니다. 내가 조사와 술어를 밝혀SQLite 백엔드로 단정 된 NSFetchedResultsController/NSFetchRequest 성능 고정?
문제입니다 : 즉 페치 기업
NSPredicate *somePredicate = [NSPredicate predicateWithFormat:@"ANY somethings == %@", something];
[fetchRequest setPredicate:somePredicate];
, "일"을 부르는, "뭔가"엔티티와 다 대다 관계를 가지고있다. 이 술어는 결과를 특정 "무언가"와 관계가있는 것만으로 제한하는 필터입니다.
테스트를 위해 술어를 제거한 경우 가져 오기 시간 (초기 performFetch : 호출)이 4 초에서 100ms 이하로 떨어지는 경우가 있습니다. 하지만 Core Data와 NSFRC를 통해 얻을 수있는 많은 이익을 무효화 할 수밖에 없는데, 그렇지 않으면 강력한 도구처럼 보입니다.
제 질문은이 성능을 어떻게 최적화 할 수 있습니까? 술어를 잘못 사용하고 있습니까? 모델/스키마를 어떻게 든 수정해야합니까? 그리고 이것을 해결할 다른 방법은 없을까요? 이런 종류의 성능 저하가 예상됩니까? 세부 WITH
EDIT (.이 < 1킬로바이트 객체의 수백의 순서에있는) : 여기
코드입니다 : 이전
[fetchRequest setFetchLimit:200];
NSLog(@"before fetch");
BOOL success = [frc performFetch:&error];
if (!success) {
NSLog(@"Fetch request error: %@", error);
}
NSLog(@"after fetch");
업데이트 로그 (나는 일부 응용 프로그램의 비 효율성이 저하했다 성능은 여기에 있습니다. 현재 환경에서 얻을 수있는 최적의 상태로 업데이트 된 로그입니다.) :
2010-02-05 12:45:22.138 Special Ppl[429:207] before fetch
2010-02-05 12:45:22.144 Special Ppl[429:207] CoreData: sql: SELECT DISTINCT 0, t0.Z_PK, t0.Z_OPT, <model fields> FROM ZTHING t0 LEFT OUTER JOIN Z_1THINGS t1 ON t0.Z_PK = t1.Z_2THINGS WHERE t1.Z_1SOMETHINGS = ? ORDER BY t0.ZID DESC LIMIT 200
2010-02-05 12:45:22.663 Special Ppl[429:207] CoreData: annotation: sql connection fetch time: 0.5094s
2010-02-05 12:45:22.668 Special Ppl[429:207] CoreData: annotation: total fetch execution time: 0.5240s for 198 rows.
2010-02-05 12:45:22.706 Special Ppl[429:207] after fetch
,451,515,
나는 동일 조건없이 (질문의 시작 부분에 두 줄을 주석으로) 가져 오기 할 경우 시간에
2010-02-05 12:44:10.398 Special Ppl[414:207] before fetch
2010-02-05 12:44:10.405 Special Ppl[414:207] CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, <model fields> FROM ZTHING t0 ORDER BY t0.ZID DESC LIMIT 200
2010-02-05 12:44:10.426 Special Ppl[414:207] CoreData: annotation: sql connection fetch time: 0.0125s
2010-02-05 12:44:10.431 Special Ppl[414:207] CoreData: annotation: total fetch execution time: 0.0262s for 200 rows.
2010-02-05 12:44:10.457 Special Ppl[414:207] after fetch
20 배 차이. 500ms는 그다지 좋지 않으며 배경 스레드에서 또는 다른 방법으로 최적화 할 수있는 방법이없는 것처럼 보입니다. (별 문제가되지 않는 이진 저장소로가는 것 외에는 이진 저장소 성능이 위의 200 개 개체의 조건부 쿼리에 대해 100 밀리 초임)
(이전에 다른 질문을 중첩했습니다. , 나는 지금 moved away).
다 대다 관계에 대한 모든 검사와 관련이 있다고 생각하지만, 문제인 경우이 경우 핵심 데이터에 실망을 공유합니다. – gerry3
하나의 임의의 생각 : 가져 오기에 대한 술어를 사용하지 마십시오. 대신 모든 것을 가져 와서 런타임 동작을 수정하십시오. 예를 들어, tableviewcontroller에서 객체가 술어와 일치하지 않으면 높이가 0 인 행을 표시합니다.)하지만 어리석은 행동입니다. – Jaanus