#ios #uiprogressview
#iOS #uiprogressview
Вопрос:
У меня есть UIProgressBar, который обновляется в цикле синтаксического анализа HTML. Но она не обновляется плавно. Я хочу, чтобы она показывала плавное увеличение. Я попытался вставить async_dispatch, но затем он вообще не обновлялся. Вот мой код:
- (void)viewDidLoad
{
[super viewDidLoad];
[self performSelectorOnMainThread:@selector(getWeeklyProgram) withObject:nil waitUntilDone:NO];
}
-(void)getWeeklyProgram
{
NSURL *programURL = [NSURL URLWithString:@"http://www.mostlifeclub.com/studyo-programlari/"];
NSData *programHtmlData = [NSData dataWithContentsOfURL:programURL];
TFHpple *programHTMLParser = [TFHpple hppleWithHTMLData:programHtmlData];
NSString *activitiewXpathQueryString = @"//div[@class='wpb_row vc_row-fluid prk_full_width prk_section parallaxed']/div[@class='prk_inner_block columns centered']/div[@class='vc_span12 wpb_column column_container']/div[@class='wpb_wrapper']/div[@class='wpb_tabs wpb_content_element']//div[@class='wpb_wrapper wpb_tour_tabs_wrapper ui-tabs vc_clearfix']/div[@class='wpb_tab ui-tabs-panel wpb_ui-tabs-hide vc_clearfix']";
NSArray *activityNodes = [programHTMLParser searchWithXPathQuery:activitiewXpathQueryString];
NSMutableArray *activities = [[NSMutableArray alloc] init];
//for each node
for (TFHppleElement *element in activityNodes)
{
currentProgressCount = 1;
@try
{
//Here I want to increase ProgressBar
[self increaseProgress:currentProgressCount :activityNodes.count];
}
@catch(NSException* ex)
{
}
}
}
-(void)increaseProgress:(int)currentLine:(int)totalLines {
progressView.progress = (CGFloat)currentLine / (CGFloat)totalLines;
if(progressView.progress >= 1.0f)
{
NSLog(@"bitti");
}
}
Комментарии:
1. dispatch_async не будет работать, потому что вам нужно обновить пользовательский интерфейс из основного потока.
Ответ №1:
Запустите цикл For и трудоемкий материал в другом потоке и обновите пользовательский интерфейс в основном потоке:
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
// Time Intensive Code
dispatch_sync(dispatch_get_main_queue(), ^{
// Update UI
});
});
Возможно dispatch_sync...
, вам потребуется вставить цикл for для обновления пользовательского интерфейса