4

我有我的主线程,我在其中调用一个加载数据的方法(需要一段时间)。我用 performSelectorInBackground 调用这个方法并传递委托。数据加载方法定期回调以更新进度,它调用最初在后台启动它的同一控制器类中的方法(委托)。这个方法看起来像:

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

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

4

1 回答 1

11

您必须更新主线程上的用户界面元素。因此你必须稍微改变你的方法,因为你必须在使用时使用对象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];
于 2011-03-08T19:19:57.510 回答