ios4 – 从iOS 5开始,setProgress不再更新UIProgressView

自从iOS 5出来以来,我有一个进度条有点麻烦.下面的代码在iOS 5之前工作正常,但是在iOS 5中,进度条不再显示在循环中设置的新进度.

代码预计可以这样工作:

>创建进度条(作品)
>在新的后台进程中:设置初始进度为0.25(作品)
>在相同的后台进程:更新进度循环(在iOS 4中工作)

这是bar init的代码

// create a progress bar
UIProgressView *progressBar = [[UIProgressView alloc] initWithFrame:CGRectMake(coverSizeX*0.25,coverSizeY - 34.0,coverSizeX*0.5,9.0)];
progressBar.progress = 0.0;
progressBar.progressViewStyle = UIProgressViewStyleBar;

在不同的线程中,它将进度设置为0.25:

// set an initial progress
[progressBar setProgress: 0.25];

稍后更新一个循环中的进度来显示下载进度:

// within a for-loop:
NSNumber *counterPercentage;
for ( pageDownload = 1; pageDownload < pagesTodownload; pageDownload++ ) {
    counterPercentage = [[NSNumber alloc] initWithFloat: (float)pageDownload / (float)((float)pagesTodownload)];
    [progressBar setProgress: [counterPercentage floatValue]];
    [progressBar performSelectorOnMainThread:@selector(setNeedsdisplay) withObject:nil waitUntilDone:YES];
}

…但进度没有显示在屏幕上,进度条停留在设定的初始0.25进度.

iOS 5发行版有什么变化可能会破坏吗?

解决方法

自从iOS 5开关以来,我已经看到过很多问题,而且我不知道为什么只有在iOS 5中出现问题.但主要是因为我不知道为什么以前没有问题.

在你的代码中,你调用[progressBar setProgress:[counterPercentage floatValue]];从后台线程.这是一个UI调用,不应该从一个后台线程.此外,您也可以调用setNeedsdisplay,这不需要更新progressBar,因为UIProgressView知道如何显示它. iOS 5似乎已经使更新UI的要求更加严格,但只是至关重要的是什么是最佳实践.

对我来说,这看起来像块的完美用途.使用块,您的for循环可以这样写:

for ( pageDownload = 1; pageDownload < pagesTodownload; pageDownload++ ) {
        // Other stuff in background
    dispatch_async(dispatch_get_main_queue(),^{
        progressBar.progress = ((float)pageDownload/(float)pagesTodownload);
    });
        // Other stuff in backgroud
}

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...