スレッド AI 内で、スレッド B で実行される非同期サービスを呼び出します。サービスは、終了後にデリゲート メソッドを呼び出します。スレッド B が終了するまでスレッド A を待機させます。これには NSCondition を使用しました。
これは私のセットアップです(重要でないものをスキップしました):
-(void)load
{
self.someCheckIsTrue = YES;
self.condition = [[NSCondition alloc] init];
[self.condition lock];
NSLog(@"log1");
Service *service = // set up service
[service request:url delegate:self didFinishSelector:@selector(response:)];
while (self.someCheckIsTrue)
[self.condition wait];
NSLog(@"log3");
[self.condition unlock];
}
-(void)response:(id)data
{
NSLog(@"log2");
[self.condition lock];
self.someCheckIsTrue = NO;
// do something with the response, doesn't matter here
[self.condition signal];
[self.condition unlock];
}
何らかの理由で、「log1」のみが出力され、「log2」も「log3」も出力されません。デリゲート メソッドの応答がスレッド B である「サービス スレッド」によって呼び出されるのに対し、ロードはスレッド A によって呼び出されるのはそのためだと思います。
セマフォも試しましたが、どちらも機能しません。コードは次のとおりです。
-(void)load
{
NSLog(@"log1");
Service *service = // set up service
self.sema = dispatch_semaphore_create(0);
[service request:url delegate:self didFinishSelector:@selector(response:)];
dispatch_semaphore_wait(self.sema, DISPATCH_TIME_FOREVER);
NSLog(@"log3");
}
-(void)response:(id)data
{
NSLog(@"log2");
// do something with the response, doesn't matter here
dispatch_semaphore_signal(self.sema);
}
どうすればこれを機能させることができますか?