2013-09-02 8 views
0

1000,000 개의 레코드가있는 내 응용 프로그램에 ScrollView를 배치하려고 할 때이 scrollView는 응용 프로그램이 시작될 때로드되므로 많은 수의 1000,000 000 레코드가 실행될 때까지 실행되지 않습니다UIScrollView가 너무 많은 시간이 걸린다

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    [self loadIt]; 
} 

- (void)loadIt{ 

    float startX = 0; 
    float startY = 0; 
    [_bigScroll setContentSize:CGSizeMake(320, 312500)]; 
    _bigScroll.pagingEnabled = NO; 
    for (counter=0; counter<999999; counter++) 
    { 
     UIButton *tester=[[UIButton alloc] initWithFrame:CGRectMake(startX, startY, 10, 10)]; 

     if (counter % 2 == 0) { 

      [tester setBackgroundColor:[UIColor whiteColor]]; 

     } 
     else 
     { 

      [tester setBackgroundColor:[UIColor grayColor]]; 
     } 

     [_bigScroll addSubview:tester]; 
     [tester release]; 

     if (startX == 320) { 
      startX = 0; 
      startY += 10; 
     } 
     else 
      startX += 10; 

     NSLog(@"counter = %d", counter); 
    } 

} 

하십시오 조언 : 시간, 내가 궁금해서 기록을로드하는 동안 응용 프로그램과있는 ScrollView를 표시 할 수있는 방법 (그 레코드를 추가하는 동안있는 ScrollView를 표시), 코드 아래 사용하고있다.

+1

의 코드를 시도 당신이있는 tableView처럼 작동 오히려 10,000 뷰를 만드는 몇 가지 견해를 순환 형 collectionView를 사용하는 것이 좋습니다 말. iOs 6을 사용하지 않는 것이이 lib https://github.com/steipete/PSTCollectionView를 살펴 본다면 일부 개발자는 iOS4.3 이상에서 작동하는 오픈 소스 버전을 만들었습니다. – BooRanger

+0

또한 변수를 색으로 유지하고 nslog를 호출하지 않는 것과 같은 간단한 일은 속도가 빨라질 수 있습니다. – BooRanger

+0

나는 처음에는 모든 레코드를로드하는 대신에 몇 가지 레코드를 처음으로로드 한 다음 사용자가 스크롤하고 이전 레코드를 제거 할 때 레코드를 추가 할 수 있습니다.이 아이디어는 tableView의 셀 재사용 개념과 유사합니다. –

답변

0

레코드가로드되는 동안 앱과 scrollView를 표시 할 수있는 방법이 있습니까?

[self performSelector:@selector(loadIt) withObject:nil]; or [self performSelector:@selector(loadIt) withObject:nil afterDelay:0.2];
이 방법을 실행하기 전까지는 UI가 차단되지 않습니다.

많은 양의 레코드를로드하고 있습니다. 실제로 모든 레코드를로드하지 않아야합니다. tableview와 같은 메커니즘을 사용하십시오. 즉, scrollview의 보이는 영역에있는 레코드 만로드하십시오. 스크롤 할 때까지 새 행을로드하지 말고 행 또는 뷰를 다시 사용해야 스크롤 속도가 빨라집니다.

+0

U ROCK, 나는 ID가 무엇인지 알기를 원합니다. –

+0

스크롤이 끝나면 다른 사람을 스크롤 할 수있는 간단한 방법이 있습니까? –

+0

당신이 무엇을 요구하고 있는지 확실하지 않습니다. – Iducool

0

에 대한 Apple의 documentation은보기 스크롤과 같이 타일을 제공하는 응용 프로그램과 함께 스크롤 된보기를 바둑판 식으로 배열해야한다는 것을 분명히합니다.

스크롤보기에 표시된 콘텐츠 그리기를 관리하는 개체는보기가 화면 크기를 초과하지 않도록 콘텐츠의 하위보기를 바둑판 식으로 배열해야합니다. 스크롤 뷰에서 스크롤 할 때이 객체는 필요에 따라 하위 뷰를 추가하고 제거해야합니다.

이것은 성능과 메모리 사용에 모두 필요합니다. 스크롤 가능보기는 CALayer으로 백업되며 비트 맵이 사용됩니다. 생성 된 UIButton 개체 각각에 대해서도 마찬가지입니다.

시간이 많이 걸리는 것은 놀라운 일이 아니지만 너무 많은 메모리를 사용하여 앱이 종료되지 않은 것은 더 이상의 미스터리입니다.

UITableViewUICollectionView은 콘텐츠를 타일링하는보기의 예입니다. 이 중 하나를 사용하여 요구 사항을 구현할 수 있으며 필요하지 않은 경우 사용하는 모델을 따르십시오.

0

1000,000 개의보기를 만들 필요가 없습니다. 보기를 동적으로 작성하고 화면 공간에서 볼 수없는 이전보기를 제거 할 수 있습니다. 따라서 스크롤 할 때 새로운보기를 생성하고 화면의 보이는 영역 밖에있는보기를 제거 할 수 있습니다. 이렇게하면 메모리를 많이 절약 할 수 있습니다. 프로젝트에서 많은 수의 뷰를로드하면 충돌이 발생할 수 있으므로 ARC는이 경우 도움을주지 않습니다.

0

번이 변경에게

-viewdidload() 
{ 
    [self loadIt];//change this to 
    [self performSelectorInBackground:@selector(loadIt) withObject:nil]; 
} 
+0

btw : '- (void) viewDidLoad()'여야합니다. – marko

관련 문제