私は、2 つのキューが異なるスレッドで実行されるようにしたい状況にあります。理想的には、それらがシリアル キューであることを確認したいと思います。特に、以下の例では、両方のキューが同じスレッドで実行されている場合、doStuff は無期限にビジー待機状態になります。明示的なスレッド化に移行する必要がありますか、それともここで GCD の使用を救うことができますか?
- (void)foo {
self.responseQueue = dispatch_queue_create("com.blah.response", DISPATCH_QUEUE_SERIAL);
self.requestQueue = dispatch_queue_create("com.blah.request", DISPATCH_QUEUE_SERIAL);
dispatch_async(self.requestQueue, ^{
[self doStuff];
});
}
- (BOOL)doStuff {
BOOL __block waiting = YES;
self.responseBlock = ^{
waiting = NO;
};
[self performRequest];
while (waiting) {
// realize could use dispatch_semaphore (busy waiting just to illustrate point).
sleep(1);
}
[self doStuffRequiringResponseCompletion];
// I realize it would be sensible to
// 1) Not block in the above while loop.
// 2) Call |doStuffRequiringResponseCompletion| after |receivedResponse|.
// I don't want to do this.
}
// method called on arbitrary thread
- (void)receivedResponse {
// stuff
dispatch_async(self.responseQueue, self.responseBlock);
}