我在主线程中使用NSProgressIndicator来更新我的整个方法时的进度。现在,当我最终从另一个类文件中调用一个对象,并等待该对象返回主线程的值时,我注意到NSProgressIndicator将消失。我知道这是因为主线程被阻塞,直到我从另一个对象获得返回值为止。

所以我的问题是,在不阻塞主界面的情况下更新UI并在后台运行其他对象并根据需要将值返回到主线程的推荐方法是什么?我知道如何使用块,但不允许块操作返回值。
我需要的是可以帮助此伪代码的东西:

-(IBAction) main {

//Update progress indicator UI to show progress
//perform an call to another object from another class.
// wait till i get its return value.
//Update progress indicator UI to show progress
// Use this return value to do something.
//Update progress indicator UI to show progress


}

当调用另一个对象时,我注意到由于主线程被阻塞,我已经确定的NSProgressIndicator完全消失了。谢谢。

最佳答案

您上面的代码不是正确的方法。由于main从不返回,因此进度指示器将永远不会更新。您必须在主线程上快速返回。

相反,您想要做的是设置一个后台块,该块在各个点上都会更新主线程上的进度指示器。因此,例如:

- (IBAction)start:(id)sender {
  dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

  dispatch_async(queue, ^{
    dispatch_async(dispatch_get_main_queue(), ^{[self.progress setProgress:0];});

    // Doing some stuff
    dispatch_async(dispatch_get_main_queue(), ^{[self.progress setProgress:.25];});

    // Doing more stuff
    dispatch_async(dispatch_get_main_queue(), ^{[self.progress setProgress:.75];});
  });
}

(是的,这会导致队列保留self,但这是可以的,因为self没有保留队列。)

10-08 06:28