自从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 }