iOS版 - UIProgressView只更新一次(iOS - UIProgressView o

2019-09-22 01:44发布

我加载从API数据和正在使用UIProgressView显示多少已加载。

在我的viewWillAppear中我使用可达性检查,有互联网连接。 然后,如果有,下面的行被称为在一个函数的10倍。

[self performSelectorInBackground:@selector(updateProgress) withObject:nil];

这则运行此方法

-(void)updateProgress {
    float currentProgress = myProgressBar.progress;
    NSLog(@"%0.2f", currentProgress);
    [loadingProg setProgress:currentProgress+0.1 animated:YES];
}

0.1浮子增量和装载视图显示这一点。

当视图驳回(它是模态的视图),然后回顾,该方法的运行和的NSLog表明currentProgress被递增,它应。 但是,进度栏保持空白。 有谁知道这是什么原因?

作为参考,我使用ARC。

更新:

这是我如何调用API

NSString *urlString = **url**;
NSURL *JSONURL = [NSURL URLWithString:urlString];
NSURLRequest *request = [NSURLRequest requestWithURL:JSONURL
                        cachePolicy:NSURLRequestReloadIgnoringCacheData 
                        timeoutInterval:10];
if(connectionInProgress) {
    [connectionInProgress cancel];
}
connectionInProgress = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];

//This is where I call the update to the progress view

我有以下功能:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    JSONData = [NSMutableData data];
    [JSONData setLength:0];
}

 - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [JSONData appendData:data];
}

-(void) connectionDidFinishLoading:(NSURLConnection *)connection
{
    //add data to mutable array and other things
}

Answer 1:

当你正在处理的用户界面(UI)组件,您必须执行在主线程的方法。 当你的程序规则,你需要在主线程设置的UI操作,而沉重,复杂,更表现在后台线程苛刻的操作 - 这就是所谓的多线程(如一侧的建议,将是很好的了解GCD - 大中央调度。如果你需要做的更长的操作, 检查从雷Wenderlich本很好的教程 。)

为了解决这个问题,你应该叫[self performSelectorOnMainThread:@selector(updateProgress) withObject:nil]; 然后,在该方法中,执行以下操作:

-(void)updateProgress {
    float currentProgress = myProgressBar.progress;
    NSLog(@"%0.2f", currentProgress);
    dispatch_async(dispatch_get_main_queue(), ^{
    [loadingProg setProgress:currentProgress+0.1 animated:YES];
    });
}


Answer 2:

UI刷新需要在主线程上发生。 更改

[self performSelectorInBackground:@selector(updateProgress) withObject:nil];

[self performSelectorOnMainThread:@selector(updateProgress) withObject:nil waitUntilDone:NO];


文章来源: iOS - UIProgressView only updating once