2012-06-19 4 views
0

자, 상황이 이렇습니다. 나는 텍스트와 이미지 (꽤 큰 이미지)가 포함 된 문서를 저장하고로드 할 수있는 프로그램을 만들고 있습니다. 백엔드의 경우 UIManagedDocument의 CoreData와 내 자신의 하위 클래스 인 NotificationDocumentNSManagedDocument으로 사용하고 있습니다.iOS의 CoreData에서 빠르게 데이터를 가져 오는 방법은 무엇입니까?

지금 각각 NotificationDocument에는 저장되는 저장 슬롯과 저장된 이름을 나타내는 두 개의 속성이 있습니다. 나는 (예 : "슬롯 1 저장 : 템플릿 청소") 내 문서의 목록을 표시하고있는 슬롯을 저장하는 TableView가 있습니다.

그러나이 테이블 뷰를 채우는 데는 많은 시간이 걸립니다. 내가 일을하고있는 viewDidLoad에있는 것은 :

NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"NotificationDocument"]; 
NSArray *notifications = [self.database.managedObjectContext executeFetchRequest:fetchRequest error:nil]; 

내가 그들의 전체에 notificationDocuments을 모두 검색하고 메모리로 이동하고 있기 때문에 내 프로그램이 너무 느리게 실행되고 있는지 의심 논리적 보인다. 모든 notificationDocuments가 실제로 필요하지 않다는 것을 고려하면 더 나은 (더 빠른) 방법일까요? 저장 공간 만 필요하고 이름 속성을 저장할 필요가 있습니다. 이것을 달성하는 가장 좋은 방법은 무엇입니까?

저는 CoreData에 저장 한 맵 엔티티를 슬롯에 저장된 이름에 저장하는 것에 대해서도 생각했습니다. 그러나 완전히 별도의 엔티티를 저장하지 않고이 작업을 수행하는 것이 좋은 방법이라면 바람직합니다. 감사.

답변

3

UITableView을 동적으로 채우려면 NSFetchedResultsController을 사용해야합니다. 이렇게하면 현재 메서드가 아닌 새 셀이 요청 될 때 핵심 데이터 호출이 동적으로 호출됩니다.이 메서드는보기를로드 할 때 대부분의 데이터가 필요하지 않더라도 모든 데이터를 한 번에로드합니다.

다음

당신이 여기

NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"NotificationDocument"]; 
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"attribute" ascending:NO]; 
    fetchRequest.sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; 


    fetchedResultsController = [[NSFetchedResultsController alloc] 
           initWithFetchRequest:fetchRequest 
           managedObjectContext:self.database.managedObjectContext 
           sectionNameKeyPath:nil 
           cacheName:@"ListCache"]; 
    fetchedResultsController.delegate = self; 
    NSError *error = nil; 
    [fetchedResultsController performFetch:&error]; 

그리고 (fetchedResultsController 그것은에있는 뷰 컨트롤러의 속성이어야 함) cellForRowAtIndexPath 올바른 문서를 잡기 위해 라인이있는 데이터를 설정해야한다 대략 코드입니다 (분명히 올바른 객체 클래스가 아닐 수도 있음)

NotificationDocument *currentDocument = [fetchedResultsController objectAtIndexPath:indexPath]; 

이렇게하면 속도가 크게 향상됩니다.

0

Dima가 말했듯이 NSFetchedResultsController를 사용하는 것이 좋습니다. 문제가 해결되지 않으면

https://github.com/rafaeladson/intern-objc/blob/master/InternIOS/BaseTableViewController.m

https://github.com/rafaeladson/intern-objc/blob/master/UnitTests/SampleTableViewController.m

https://github.com/rafaeladson/intern-objc/blob/master/UnitTests/BaseTableViewControllerTest.m

는 사용하려고 :

난 당신이보고 싶을 경우,이 체크 아웃하기 전에 그것을 사용 Xcode의 Instruments 앱을 사용하여 문제가 무엇인지 파악하십시오. 한 oreder에서

0

당신은 또한

[nsfetchReqObj setFetchBatchSize:size]; 

는 또한 가져 오는 속도를 증가 사용할 수있는 핵심 데이터에서 항목의 집합을 검색 할 수 있습니다.

관련 문제