iOS устанавливает значение индикатора выполнения во время обработки изображений

У меня есть приложение, обрабатывающее пару изображений с помощью Quartz, и я хотел иметь UIProgressView, который изменяется после каждого действия. (например, 0,0 0,2 0,4 0,6 0,8 1,0)

Проблема в том, что, похоже, пока мое изображение обрабатывается, пользовательский интерфейс полностью заблокирован, а значение изменяется только после того, как весь процесс завершен (это означает, что оно просто достигает 1.0 без прохождения подэтапов),

Кто-нибудь из вас когда-нибудь сталкивался с этим?

Псевдо:

for(uint i=0;i<5;i++){
    // Execute some Quartz based action here, such as CGContextDrawTiledImage etc...
    myProgress.progress = (i+1) * 0.2;
}

Таким образом, на самом деле вместо того, чтобы индикатор выполнения изменялся после каждого действия, он изменяется только один раз в конце на 1.0. Был бы признателен за ваш отзыв или опыт или это.

Спасибо
Шай.


person Shai Mishali    schedule 02.09.2011    source источник


Ответы (1)


arrow_upward
2
arrow_downward

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

Взгляните на [NSThread detachNewThreadSelector:selector toTarget:target withObject:object];

Сделайте свой прогресс переменной-членом

 [NSThread detachNewThreadSelector:@selector(updateFilterProgress) toTarget:self withObject:nil];

 prgLoader.progress = x;


- (void) updateFilterProgress{

    NSAutoreleasePool *pool = [NSAutoreleasePool new];

    while ([prgLoader.progress floatValue] < 1.0f)    //Keep this thread alive till done loading. You might want to include a way to escape (a BOOL flag)
    {
        GTMLoggerInfo(@"Updating progress to %f", [progress floatValue]);
        prgLoader.progress = [progress floatValue];
    }
    [pool release];

}
person James Webster    schedule 02.09.2011
comment
Просто для уверенности, скажем, я помещаю строку myProgress.progress в другой селектор и выполняю ее в другом потоке? Это то, что вы предлагаете? Я попробую :) звучит хорошо. - person Shai Mishali; 02.09.2011
comment
Эй, я безуспешно пробовал следующее, я что-то делаю не так? Также прикреплен журнал: pastebin.com/GfCqmq1s - person Shai Mishali; 02.09.2011
comment
Неважно, только что добавлен NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; и это устранило проблему :) - person Shai Mishali; 02.09.2011
comment
О, понятно, так что лучше иметь один поток один раз и убить его в конце вместо того, чтобы запускать и убивать поток для каждого обновления ... имеет смысл :) - person Shai Mishali; 02.09.2011
comment
Не обязательно, я бы так и поступил. Это, конечно, может быть не лучшим вариантом, и могут возникнуть проблемы с потоками. Рассмотрите возможность добавления к нему с помощью @synchronized или других методов, чтобы сделать его потокобезопасным. - person James Webster; 02.09.2011
comment
Я не совсем уверен, что такое @synchronized, возможно, я смогу прочитать какую-нибудь ссылку? Очень признателен :) - person Shai Mishali; 02.09.2011
comment
Это первое, что я нашел: softpixel.com/~cwright/programming/threads /threads.cocoa.php Ваши ключевые слова: многопоточность, синхронизация, мьютекс, потокобезопасность и т. д., если вы хотите искать самостоятельно - person James Webster; 02.09.2011