3

我正在从 API 加载数据,并使用 UIProgressView 来显示加载了多少。

在我的 viewWillAppear 中,我使用 Reachability 来检查是否有 Internet 连接。然后,如果有,则在函数中调用以下行 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
}
4

2 回答 2

7

当您处理用户界面 (UI) 组件时,您必须在主线程中执行这些方法。通常,当您编程时,您需要在主线程中设置 UI 操作,并在后台线程中设置繁重、复杂且对性能要求更高的操作 - 这称为多线程(作为附带建议,最好阅读 GCD - Grand Central Dispatch。如果您需要执行更长的操作,请查看 Ray 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];
    });
}
于 2012-09-02T11:00:53.743 回答
2

UI 刷新需要在主线程上进行。改变

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

[self performSelectorOnMainThread:@selector(updateProgress) withObject:nil waitUntilDone:NO];
于 2012-09-02T11:01:50.117 回答