有什么方法可以在代码中“等待……” – 就像空循环一样?

考虑这个代码:

[self otherStuff]; // "wait here..." until something finishes while(!self.someFlag){} [self moreStuff]; 

请注意,这一切都发生在同一线程 – 我们不想去另一个线程。

otherStuff可以做的事情就像连接到云,从用户获得input等,所以这将需要很多时间,可以遵循许多可能的path。

otherStuff会在otherStuff最终完成时将self.someFlag设置为true。

这是完美的工作,没有任何问题,除了这是一个蹩脚的燃烧处理器像这样的空循环!

很简单,有没有办法说一些像..

 halt here, until (some message, interrupt, flag, boolean, whatever?) 

而不只是while(!self.someFlag){}

(注意,另一种方法是“链接”程序…所以在“otherStuff”的结尾,你和其他所有程序员必须“知道”你不得不下一次调用“moreStuff”当然,当你必须添加新的程序或改变事物的顺序时,这是非常混乱的)干杯!

顺便说一句,关于当你想要不同的线程的情况已经有两个很好的答案。

这是一个使用信号量的解决scheme,注意不要引入死锁 – 你需要某种方式告诉你的应用程序已经完成了,你可以使用NSNotificationCentre来完成,就像你所build议的那样,但是使用块容易。

 [self someOtherStuffWithCompletion:nil]; dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); [self someOtherStuffWithCompletion:^{ dispatch_semaphore_signal(semaphore); }]; NSLog(@"waiting"); dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); NSLog(@"finished"); [self someOtherStuffWithCompletion:nil]; 

我会build议使用一个NSOperationQueue,并等待所有的任务,直到他们在特定的点完成。 类似的东西:

 self.queue = [[NSOperationQueue alloc] init]; // Ensure a single thread self.queue.maxConcurrentOperationCount = 1; // Add the first bunch of methods [self.queue addOperation:[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(method1) object:nil]]; [self.queue addOperation:[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(method2) object:nil]]; [self.queue addOperation:[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(method3) object:nil]]; // Wait here [self.queue waitUntilAllOperationsAreFinished]; // Add next methods [self.queue addOperation:[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(method4) object:nil]]; [self.queue addOperation:[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(method5) object:nil]]; // Wait here [self.queue waitUntilAllOperationsAreFinished]; 

HTH