2

我有一个带有三个标签的标签栏应用程序。在我的第二个标签视图中,我有一个UIProgressView. 我的viewDidLoad方法中有一个 NSTimer,它调用一个更新 progressView 的方法

progressTimer = [NSTimer scheduledTimerWithTimeInterval:1.5 target:self selector:@selector(updateProgress) userInfo:nil repeats:YES];

到目前为止一切都很好。

我想知道如何在应用程序的整个生命周期中在后台运行计时器,以便progressView无论用户在哪个视图中都会更新。如果您可以向我展示代码片段,那就太好了。

提前致谢。

4

3 回答 3

1

不建议从后台线程更新 UI 元素。此外,当用户不在该视图中时,不建议修改该视图的 UI 元素。您正在使用宝贵的系统资源。

更好的方法是在该视图变为活动状态后立即更新 ProgressBar ...

更新:您可以在这里查看以了解如何在后台线程中运行任务。您可以在您在那里指定的选择器中设置您NSTimer的开始。但同样,这种东西可能会导致一些奇怪的错误。最好避免..

于 2011-08-10T07:43:07.490 回答
0

您可以在 ProgressViewController 中(甚至在应用程序委托中)保留一个属性,例如float跟踪进度的属性。当您需要更新进度时,另一个 ViewController 可以更改该属性的值。

一旦视图变得可见,更新 UI ( UIProgressView) 从viewWillAppear:.

于 2011-08-10T08:12:02.207 回答
0

你可以通过这种方式在后台添加方法

dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Add code here to do background processing
// increment the progress here and keep the property of that count in appdelegate 
//
dispatch_async( dispatch_get_main_queue(), ^{
    // Add code here to update the UI/send notifications based on the
    // results of the background processing
});

});

在不同视图的 viewWillAppear 中,您可以这样设置: [loadingProgressView setProgress: appDelegate.count];

于 2013-02-08T08:14:52.280 回答