UIProgressView не обновляется

Если это важно: - Я использую раскадровки - Базовые данные - xcode 4.6

В моем приложении есть UITableViewController для определенного представления. В этом представлении, если пользователь нажимает кнопку, программное обеспечение проходит через несколько процессов, в ходе которых данные загружаются из Интернет-API и сохраняются в основных данных. Я уверен, что это пожиратель ресурсов, поэтому я пытаюсь завершить эти процессы в отдельных потоках.

Примечание: - Существует порядок операций, поскольку этапы зависят от обменов. Обмены зависят от расы и позиций. Позиции зависят от расы. В противном случае я бы выполнил все асинхронно.

Проблемы: - Я впервые работаю с Grand Central Dispatch. Я не уверен, что делаю это правильно. - Если я закомментирую обработку данных, UIProgressView будет виден и обновится, как и ожидалось. С обработкой данных система кажется слишком загруженной, чтобы даже отображать UIProgressView.

Методы управления загрузками и прогрессом приведены ниже.


- (IBAction)downloadNow:(id)sender {

[progressView setHidden:NO];
[progressView setProgress:0.1 animated:YES];

dispatch_sync(backgroundQueue, ^(void){
    [self saveRace];
    [self updateProgress:0.2];
});

dispatch_sync(backgroundQueue, ^(void){
    [self savePositions];
    [self updateProgress:0.3];
});

dispatch_sync(backgroundQueue, ^(void){
    [self downloadExchanges];
    [self saveExchanges];
    [self updateProgress:0.4];
});

dispatch_sync(backgroundQueue, ^(void){
    [self downloadLegs];
    [self saveLegs];
    [self updateProgress:0.5];
});

dispatch_sync(backgroundQueue, ^(void){
    Utilities *utilities = [[Utilities alloc] init];
    [utilities calculateStartTimes:race with:managedObjectContext];
    [self updateProgress:1.0];
});

}

  • (void)updateProgress:(double)completedPercentage { if (completedPercentage == 1.0) { [self goHome]; } else if ([importExchanges count] > 0) { [progressView setProgress:completedPercentage анимированные:YES]; } }

Любая помощь приветствуется.


person alockrem    schedule 21.06.2013    source источник
comment
Как насчет того, чтобы обернуть эти блоки dispatch_sync в один блок dispatch_async, а затем выполнить updateProgress в основном потоке, поскольку это обновление пользовательского интерфейса?   -  person Valent Richie    schedule 22.06.2013
comment
Я думаю ты прав. Если вы сделаете это предложение в качестве ответа, я отмечу его как правильное. Спасибо.   -  person alockrem    schedule 23.06.2013


Ответы (1)


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

Например:

dispatch_async(backgroundQueue, ^(void){
    [self saveRace];
    [self updateProgress:0.2];

    [self savePositions];
    [self updateProgress:0.3];

    [self downloadExchanges];
    [self saveExchanges];
    [self updateProgress:0.4];

    [self downloadLegs];
    [self saveLegs];
    [self updateProgress:0.5];

    Utilities *utilities = [[Utilities alloc] init];
    [utilities calculateStartTimes:race with:managedObjectContext];
    [self updateProgress:1.0];
});

После этого вы можете перенести обновление progressView в основной поток, потому что это обновление пользовательского интерфейса.

- (void)updateProgress:(double)completedPercentage {
    if (completedPercentage == 1.0) {
        [self goHome];
    } else if ([importExchanges count] > 0) {
        dispatch_async(dispatch_get_main_queue(), ^{
            [progressView setProgress:completedPercentage animated:YES];
        });
    }
}
person Valent Richie    schedule 23.06.2013