1

我正在加载一个文件,并希望在 UIProgressView 中显示进度。我可以设置初始值:

[loadingProgressView setProgress: 0.00];

..in viewDidLoad 这很完美。

然后我唯一想做的就是在每个循环中向条形添加 0.1,但它不会更新:

 while (eOF != 99999) {

    ...

    [loadingProgressView setProgress:loadingProgressView.progress + 0.10];

 }

我已经检查过,但在每次循环时都没有真正找到任何关于更新栏的内容。

任何人都可以分享一些建议吗?

- -更新 - -

试过这个没有成功:

while (eOF != 99999) {

    ...

    [loadingProgressView setProgress:loadingProgressView.progress + 0.10];
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate date]];

 }
4

5 回答 5

11

您正在循环通过阻塞主线程的 while 循环,UI 元素将无法刷新,直到主线程可用。解决此问题的最佳方法是在后台线程中运行此代码(在主线程上进行 UI 调用)。

或者(我不确定这个,看这个讨论)你通过调用让主线程有一些喘息的空间

NSDate* futureDate = [NSDate dateWithTimeInterval:0.001 sinceDate:[NSDate date]];
[[NSRunLoop currentRunLoop] runUntilDate:futureDate];
于 2011-11-13T14:52:29.430 回答
4

UI 会作为运行循环的一部分进行更新,而在该 while 循环期间不会发生这种情况。你可以通过调用它来运行它:

[[NSRunLoop currentRunLoop] runUntilDate:[NSDate date]];

这会强制循环更新 UI 等。

于 2011-11-13T14:49:50.573 回答
4

我的最终解决方案

首先,如果这是关闭此线程的错误方式,我深表歉意!

经过大量的测试和调查,我终于做了如下显示我的 UIProgressView:

while (eOF != 99999) {

    ...

    [NSThread sleepForTimeInterval: 0.01];
    [self performSelectorOnMainThread: @selector(makeMyProgressBarMoving) withObject: nil waitUntilDone: NO];

 }



-(void)makeMyProgressBarMoving {
    float actual = [loadingProgressView progress];
    loadingProgressView.progress = actual + receivedData;
} 

...现在终于可以完美运行了:-)

不过,感谢大家的帮助,我从中学到了很多。

于 2011-11-14T00:44:49.637 回答
2

我想在这种情况下正确的方法是使用块和多线程。您的代码将如下所示:

dispatch_queue_t myQueue = dispatch_queue_create("my queue", NULL);
dispatch_async(myQueue, ^
{
    while (eOF != 99999) {

        // ...
        // your code
        // ...

        dispatch_async(dispatch_get_main_queue(), ^{
            loadingProgressView.progress += 0.10;
        });
    }
});
dispatch_release(myQueue);

有关更多信息,请参见 Paul Hegarty 的演讲http://itunes.apple.com/itunes-u/ipad-iphone-application-development/id480479762第10 讲,非常清晰的解释和教程。

于 2012-01-09T16:58:03.310 回答
0

你可以尝试几件事。

首先,检查你的 UIProgressView 的当前值是多少(在你增加它之前)

IE

float progress = loadingProgressView.progress;

[loadingProgressView setProgress: progress+0.10];

(在该行设置断点以查看进度是否增加)

其次,通过以下方式强制更新:

[loadingProgressView setNeedsDisplay];

看看会发生什么。

于 2011-11-13T14:36:45.927 回答