Добавление UIViews с использованием GCD - PullRequest
1 голос
/ 05 ноября 2011

В приложении, которое я разрабатываю, у меня есть горизонтальная UIScrollView, которая используется как вид таблицы.

Добавление подпредставлений к нему заблокировало основной поток, поэтому я решил вместо этого использовать GCD, создать представления в фоновом потоке и добавить их к экземпляру UIScrollView в главной очереди.

Соответствующий код:

NSUInteger numberOfItems = [_dataSource numberOfItemsInBandView:self];
CGFloat __block nextX = 0.0;

dispatch_queue_t bgQueue = dispatch_queue_create("bandview", NULL);

for (NSUInteger i = 0; i < numberOfItems; i++) {
    dispatch_async(bgQueue, ^{
        UIView *itemView = [_dataSource bandView:self viewForItemAtIndex:i];
        itemView.frame = CGRectMake(nextX, 0, itemView.frame.size.width, itemView.frame.size.height);
        dispatch_async(dispatch_get_main_queue(), ^{ 
            [_scrollView addSubview:itemView];
            _scrollView.contentSize = CGSizeMake(nextX, self.frame.size.height);
        });
        nextX += itemView.frame.size.width;
    });
}

dispatch_release(bgQueue);

_scrollView - это экземпляр UIScrollView (правильно инициализированный).

Я ожидал увидеть, что подпредставления добавляются к UIScrollView один за другим, но вместо этого я испытываю то, что все работает асинхронно, а затем полосы прокрутки обновляются со всеми добавленными сразу подпредставлениями ( это не то, что я ожидаю).

Кто-нибудь может определить, что мне здесь не хватает?

Ответы [ 2 ]

3 голосов
/ 05 ноября 2011

UI изменения должны произойти в главном потоке.Выполнение UI изменений в фоновом потоке (асинхронная очередь gcd) приведет к неопределенному / нежелательному поведению, как вы видите.Кажется маловероятным, что добавление подпредставлений является основной причиной проблемы.Проблема, вероятно, заключается в том, как данные извлекаются для подпредставлений.Решением было бы добавить все подпредставления, затем асинхронно получать данные для них, а затем обновлять их по завершении операции.Также подумайте о том, чтобы не добавлять представления, которые не будут видны пользователю, и добавлять их динамически, когда пользователь выполняет прокрутку, аналогичную работе UITableView.

0 голосов
/ 05 ноября 2011

Еще одна вещь, на которую стоит обратить внимание, - это то, что вы создали последовательную очередь (bandview) для отправки запросов на создание UIView, но это также означает, что каждый запрос на создание будет происходить в линейном порядке по сравнению с тем, как он создается наиболее возможным способом.Вы можете попытаться отправить запросы на создание в одну из глобальных параллельных очередей, если это нежелательно.

...