2011-03-08 40 views
4

我有我的主线程,我调用加载数据的方法(需要一段时间)。我用performSelectorInBackground调用此方法并传递委托。数据加载方法定期回调以更新进度,它调用最初在后台启动它的同一控制器类中的方法(委托)。这种方法看起来像:即使主线程似乎运行良好,UIProgressView也不会更新

-(void)loadingProgress:(float)progress{ 
    NSLog(@"Progress %f", progress); 
    myProgressView.progress = progress; 
} 

所以我知道该方法被调用运行,因为我得到了增加进度值的日志读出,但进度指示器不动。我发现的一切都表明确保主线程可以自由更新视图,但是NSLog运行的事实并不意味着它是免费的?这是怎么回事?

+0

感谢Peter纠正标签!我是新来的网站,所以我在学习,我一定会更好地标记我未来的问题! – omsid 2011-03-08 20:48:16

回答

11

您必须更新主线程上的userinterface元素。而为此你必须改变你的方法一点点,因为你必须使用对象使用performSelectorOnMainThread:withObject:waitUntilDone:

当你的方法应该是这样的:

-(void)loadingProgress:(NSNumber *)nProgress{ 
    float progress = [nProgress floatValue]; 
    NSLog(@"Progress %f", progress); 
    myProgressView.progress = progress; 
} 

和你叫它:

[delegate performSelectorOnMainThread:@selector(loadingProgress:) withObject:[NSNumber numberWithFloat:progress] waitUntilDone:NO]; 
+0

谢谢,那就是诀窍! – omsid 2011-03-08 20:45:31

+0

@Matthias是否可以这样做,“[progressView performSelectorOnMainThread:@selector(setProgress :) withObject:[NSNumber numberWithFloat:progress] waitUntilDone:No];”?如果不是,为什么不呢?为什么我们不得不调用一个包装器方法而不是告诉UIProgressView在主线程上改变其进度? – BigSauce 2013-03-17 06:41:55

相关问题