Ios UIProgressView是否未更新?

Ios UIProgressView是否未更新?,ios,multithreading,ios5,uiprogressview,Ios,Multithreading,Ios5,Uiprogressview,我已经开始在iOS5中使用UIProgressView,但还没有真正使用它。更新视图时遇到问题。每次更新进度后,我都有一组连续的操作。问题是,进度视图并不是一点一点地更新,而是在全部完成之后才更新。事情是这样的: float cnt = 0.2; for (Photo *photo in [Photo photos]) { [photos addObject:[photo createJSON]]; [progressBar setProgress:cnt animated:YE

我已经开始在iOS5中使用UIProgressView,但还没有真正使用它。更新视图时遇到问题。每次更新进度后,我都有一组连续的操作。问题是,进度视图并不是一点一点地更新,而是在全部完成之后才更新。事情是这样的:

float cnt = 0.2;
for (Photo *photo in [Photo photos]) {
    [photos addObject:[photo createJSON]];
    [progressBar setProgress:cnt animated:YES];
    cnt += 0.2;
}
浏览stack overflow时,我发现了这样的帖子-,这意味着为了让它工作,我需要运行一个单独的线程


我想澄清这一点,UIProgressView是否真的需要单独的线程才能正常工作?

是的,ProgressView的整个目的就是为了线程

如果在主线程上运行该循环,则会阻塞UI。如果阻止UI,则用户可以交互,UI无法更新。您应该在后台线程上完成所有繁重的工作,并在主线程上更新UI

这是一个小样品

- (void)viewDidLoad
{
    [super viewDidLoad];

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

}

- (void)backgroundProcess
{    
    for (int i = 0; i < 500; i++) {
        // Do Work...

        // Update UI
        [self performSelectorOnMainThread:@selector(setLoaderProgress:) withObject:[NSNumber numberWithFloat:i/500.0] waitUntilDone:NO];
    }
}

- (void)setLoaderProgress:(NSNumber *)number
{
    [progressView setProgress:number.floatValue animated:YES];
}
-(void)viewDidLoad
{
[超级视图下载];
[self-performSelectorInBackground:@selector(backgroundProcess),对象:nil];
}
-(无效)背景过程
{    
对于(int i=0;i<500;i++){
//做工作。。。
//更新用户界面
[self-performSelectorOnMainThread:@selector(setLoaderProgress:)with对象:[NSNumber numberWithFloat:i/500.0]waitUntilDone:NO];
}
}
-(无效)setLoaderProgress:(NSNumber*)编号
{
[progressView setProgress:number.floatValue动画:是];
}

.h
文件中定义
UIProgressView

IBOutlet UIProgressView *progress1;
test=1.0;
progress1.progress = 0.0;
[self performSelectorOnMainThread:@selector(makeMyProgressBarMoving) withObject:nil waitUntilDone:NO];

- (void)makeMyProgressBarMoving {
    NSLog(@"test    %f",test);
    float actual = [progress1 progress];
    NSLog(@"actual  %f",actual);

    if (progress1.progress >1.0){
        progress1.progress = 0.0;
        test=0.0;
    }

    NSLog(@"progress1.progress        %f",progress1.progress);
    lbl4.text=[NSString stringWithFormat:@" %i %%",(int)((progress1.progress) * 100)  ] ;
    progress1.progress = test/100.00;//actual + ((float)recievedData/(float)xpectedTotalSize);
    [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(makeMyProgressBarMoving) userInfo:nil repeats:NO];
    test++;

}
.m
文件中:

IBOutlet UIProgressView *progress1;
test=1.0;
progress1.progress = 0.0;
[self performSelectorOnMainThread:@selector(makeMyProgressBarMoving) withObject:nil waitUntilDone:NO];

- (void)makeMyProgressBarMoving {
    NSLog(@"test    %f",test);
    float actual = [progress1 progress];
    NSLog(@"actual  %f",actual);

    if (progress1.progress >1.0){
        progress1.progress = 0.0;
        test=0.0;
    }

    NSLog(@"progress1.progress        %f",progress1.progress);
    lbl4.text=[NSString stringWithFormat:@" %i %%",(int)((progress1.progress) * 100)  ] ;
    progress1.progress = test/100.00;//actual + ((float)recievedData/(float)xpectedTotalSize);
    [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(makeMyProgressBarMoving) userInfo:nil repeats:NO];
    test++;

}

我也有类似的问题。UIProgressView没有更新,尽管我做了setProgress,甚至尝试了setNeedsDisplay等

float progress = (float)currentPlaybackTime / (float)totalPlaybackTime;
[self.progressView setProgress:progress animated:YES];
在setProgress部分的进度之前,我有(int)。如果使用int调用setProgress,它将不会像UISlider那样更新。应该仅使用0到1之间的浮点值来调用它