2010-03-07 2 views
0

내 앱은 핵심 데이터에서 주석을 가져온지도를 보여줍니다. 현재지도에 대한 viewDidLoad에서 performFetch을 수행하지만, tabViewController에서 해당 탭을 선택하면 화면에 즉시 나타나는지도가 지연됩니다. performFetch에게 전화하는 데 더 적합한 곳이 있습니까? 아니면 제가 잘못하고있는 다른 것이 있습니까? 그것은 Core Data로부터 약 250 개의 객체를 반환합니다.어떤 뷰 라이프 사이클 메소드를 수행해야합니까? 핵심 데이터를 가져 오나요?

덕분에

답변

2

스레딩 실행 중/대신 /에 대해 가져 오기를 작은 배치 크기 (예 : 10 개 개체)로 제한 할 수 있습니다. 그런 다음 10 개의 객체를 가져 와서 표시 한 다음 다음 10 개를 가져 오는 식으로 진행합니다. 이렇게하면 인터페이스가 라이브로 유지되며 사용자는 점진적 프로세스를보고 있다는 것을 이해할 수 있습니다.

-[NSFetchRequest setFetchLimit:]을 사용하면 페치 당 반환되는 객체 수를 제한하고 -[NSFetchRequest setFetchOffset:]은 후속 페치를 색인화합니다. fetchOffset에 애플 문서에서

는 :

The default value is 0.

This setting allows you to specify an offset at which rows will begin being returned. Effectively, the request will skip over the specified number of matching entries. For example, given a fetch which would normally return a, b, c, d, specifying an offset of 1 will return b, c, d, and an offset of 4 will return an empty array. Offsets are ignored in nested requests such as subqueries.

This can be used to restrict the working set of data. In combination with -fetchLimit, you can create a subrange of an arbitrary result set.

당신은 또한 당신의 코어 데이터 객체 그래프 디자인을보고 할 수 있습니다. 250 개 개체가 많지 않으므로 많은 개체에서 중요한 성능 저하가 발생해서는 안됩니다. 하나의 엔티티에 많은 양의 데이터를 쌓아야하므로 불필요한 많은 데이터를 처리해야 비교적 사소한 정보를 얻을 수 있습니다.

예를 들어 일반적인 실수는 Person 엔터티와 같이 일반적으로 액세스되는 엔터티에 이미지와 같은 많은 양의 데이터가있는 특성을 추가하는 것입니다. 이 때문에 Person.name 특성을 얻으려면 수백 킬로바이트의 이미지를로드해야하기 때문에 문제가 발생합니다.

더 나은 디자인은 큰 엔티티를 자체 엔티티에 주차시키고 다른 엔티티에 관계로 링크하는 것입니다. 그렇게하면 대용량 데이터 청크는 명시 적으로 관계를 호출 할 때만 폴트됩니다. 위의 예에서 이미지를 자체 엔티티에 넣습니다. 그렇게하면 Person.name을 원할 때 가벼운 텍스트에만 오류가 필요합니다.

+0

멋진 답변을 해주신 TechZen에게 250 개의 개체가 문자열과 숫자 값을 포함하고 있습니다. 이미지가 없거나 그런 이미지가 없습니다. 그러나,'fetchRequest' 메쏘드 안에 어떤 코드를 두어 각각의 리턴 된 객체를 맵에 배치했습니다. 어쩌면 이것이 성능에 미치는 영향이 – conorgriffin

+0

인 것 같습니다. 문제를 일으키는 250 개의 addAnnotation 호출처럼 들립니다. 메소드에 로그 문을 넣고 실제로 병목 현상이 어디인지 확인한 다음 병목 현상을 확인하십시오. 철회하려는 데이터는 핵심 데이터와 거의 즉각적이어야합니다. –

+0

나는이 작업을 수행하고 있다고 생각하지 않지만, 단일 객체를 가져 와서 UI에 배치하고 다음 단일 객체를 가져오고 싶지는 않습니다. 객체 수가 적을 때조차도 db를 전체적으로 검색하기 때문에 객체 수가 적 으면 영원히 필요합니다. 대신 관리 가능한 크기의 가져 오기를 수행하고 가져 오는 동안 반환 된 모든 개체를 표시 한 다음 필요에 따라 반복하십시오. – TechZen

1

viewDidAppear: 같은 다른 장소가있다 그러나 당신이 긴 쿼리를 실행하는 경우 그들은 또한 사용자 인터페이스를 잠글 것입니다.

당신이 할 수있는 한 가지는 배경 스레드에서 가져 오기를 실행 한 다음보기 컨트롤러가 주 스레드에 데이터를 표시하도록 요청하는 것입니다.

+0

감사합니다. 백그라운드 스레드에서 가져 오기를 수행했는데 제대로 작동합니다. – conorgriffin

관련 문제