2012-06-23 1 views
6

배치 크기가 20 인 NSFetchedResultsController가 모든 객체를 즉시 폴트 (즉 메모리에로드)하는 이유에 대해 지난 며칠 동안 수수께끼를 풀려고 노력했습니다. 가져 오기가 완료되면 요청이 ~ 20 초가 걸립니다.코어 데이터 객체를 사용하는 동적 UITableView 높이

내 heightForRowAtIndexPath에서 높이가 각 가져온 개체의 NSString 속성 길이를 기반으로했기 때문에 테이블을 다시로드 할 때 테이블에 2000 개의 행이 있으면 높이가 계산됩니다 처음에는 모든 행에 대해, 그리고 객체의 텍스트 속성에 액세스 했으므로 매우 초기에 객체가 20 개의 객체 (20 개 크기의 배치)로 잘못되어서 영원히 걸릴 수 있습니다. (나는 행 높이가 모두 처음에 계산되었다는 것을 몰랐다.)

배치 크기가 20 인 결과 컨트롤러를 가져 오지만 행 높이는 객체의 텍스트 속성을 기반으로합니다. 객체의 액세스가 시도되면 객체가되지 않습니다. 더 이상 오류가 있지만 실제로 메모리에로드 된 경우 높이를 계산할 때 해결 방법은 무엇입니까?

내 옵션에는 어떤 것이 있습니까?

+0

개체가 오류인지 확인하는 경우 오류가 발생합니다. 오류 일 경우 임의의 크기를 반환하고, 그렇지 않으면 문자열을 가져 와서 계산합니까? 셀을 볼 때 메서드가 다시 호출됩니까? 나는 여기서 추측하고있다. 그 또는 게으른로드 구현 (즉, 새로운 행이 스크롤로 추가됩니다) 유일한 옵션 인 것 같습니다. – jrturton

+0

heightForRow는 리로드 시작시에만 호출되며 셀이 나타날 때마다 호출되지 않습니다 (cellForRow와 같이). 그게 내가 생각한거야.하지만 그게 효과가있을 것이라고 생각하지 않아. – Snowman

+0

너무 쉽게 들릴 거라 생각 했어. – jrturton

답변

2

흥미로운 질문입니다. 성능을 향상시키기 위해 수행 할 작업은 해당 문자열 텍스트의 길이를 저장하는 속성을 모델에 만드는 것입니다. 이런 식으로 즉석에서 각 행의 길이를 계산할 필요는 없지만 사전 계산 된 높이가 있습니다.

Myabe 다른 유용한 해결책이있을 수 있습니다.

+0

하지만 개체가 더 이상 오류가 아니며 메모리에로드되는 정수 속성에 액세스해야합니다. – Snowman

+1

@mohabitar 아주 사실이 아닙니다. 가져 오기 요청에 해당 속성을 미리 가져온 다음 액세스하면 문자열 텍스트가 필요할 때까지 메모리에로드되지 않습니다. 그렇지 않으면 텍스트 속성이 오류로 유지됩니다. –

+0

맞아요,하지만 문자열 속성에 액세스 할 때 문자열을 보유하고있는 객체가 메모리에로드됩니다 (오류가 발생하기 전에 uninstantiated이기 때문에). – Snowman

-1

높이를 계산하는 뷰 컨트롤러 클래스에서 정적 메서드를 만듭니다. 이 함수를 제공하기 위해서 필요한 것은 모두 NSString이며 쉽게 계산 된 CGFloat를 반환해야합니다. 요소를 인스턴스화하지 않고 필요한 높이를 반환하는 데이 메서드를 사용합니다 (여기에 필요한 것은 텍스트의 메타 데이터뿐입니다).

+0

맞아요,하지만 그 방법은 객체를 인스턴스화하지 않고 NSString이 무엇인지 어떻게 알 수 있을까요? NSString은 객체의 속성이며 객체가 오류 인 경우 object.textProperty를 호출하면 객체가 메모리에로드됩니다. – Snowman

+0

이 문제는 구현과 관련이 있습니다. 어쩌면 인스턴스를 만들지 않고도이 문자열을 얻을 수있는 임시 해결책이 될까요? 그것은 닭고기와 달걀입니다. – Stavash