2013-09-02 4 views
0

Я пытаюсь поместить ScrollView в мое приложение с 1000 000 записей, этот scrollView будет загружаться, когда приложение запустится, поэтому приложение не будет работать, пока миллион 1000 000 записей не займет много времени время, мне было интересно, есть ли способ, чтобы показать приложение и Scrollview во время записи загрузки (показывать Scrollview при добавлении его записи), ниже код я использую: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); 
    } 

} 

Пожалуйста, советы.

+1

Допустим, вы хотите использовать CollectionView, который работает как Tableview и перерабатывает несколько видом, а затем сделать 10000 взглядов. Если вы не используете iOs 6, посмотрите на этот файл 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];
Он не будет блокировать ваш пользовательский интерфейс до выполнения этого метода.

Вы загружаете большое количество записей. На самом деле вы не должны загружать все записи во время. Вы должны использовать механизм, похожий на tableview, используя i.e.load только те записи, которые находятся в видимой области scrollview. Не загружайте новые строки до прокрутки, и вы должны повторно использовать строки или представления, чтобы ускорить прокрутку.

+0

U ROCK, I GOT UR IDEA И ЧТО ЧТО ЗАНИМАЕТСЯ СДЕЛАТЬ :) –

+0

У вас есть простой способ прокрутки других, когда заканчивается прокрутка? –

+0

Не знаете, что вы просите. – Iducool

0

Apple's documentation для UIScrollView очень ясно, что прокрученный вид должен быть выложен плиткой, а ваше приложение предоставляет плитки в виде свитков вида.

Объект, который управляет отображением содержимого, отображаемого в режиме прокрутки, должен обладать подзонами содержимого, чтобы ни один вид не превышал размер экрана. По мере того, как пользователи прокручиваются в представлении прокрутки, этот объект должен добавлять и удалять подзапросы по мере необходимости.

Это необходимо как для работы, так и для использования памяти: прокручиваемый вид поддерживается CALayer, который, в свою очередь, поддерживается растровым изображением. То же самое верно для каждого из созданных объектов UIButton.

Хотя неудивительно, что это занимает много времени, более загадочно, что ваше приложение не было прервано для использования слишком большого объема памяти.

Оба изображения UITableView и UICollectionView являются примерами представлений, которые содержат их содержимое. Вы можете обнаружить, что вы можете использовать один из них для реализации ваших требований, а если нет, следуйте модели, которую они используют.

0

Вам не нужно создавать 1000 000 просмотров. Вы можете динамически создавать представления и удалять предыдущие представления, которые не видны на экране. Таким образом, во время прокрутки вы можете создавать новые виды и удалять виды, которые находятся вне видимой области экрана. Это поможет вам сохранить память в противном случае, если вы используете ARC в своем проекте, если вы загружаете столько просмотров в памяти, что, безусловно, будет шанс сбой, ARC в этом случае вам не поможет.

0

один раз попробовать это изменение кода в

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

btw: это должно быть '- (void) viewDidLoad()' – marko

Смежные вопросы