私はこの方法IOSスレッドプール
-(void)addObjectToProcess(NSObject*)object;
を持っていると私は、この方法は、並列に4つのオブジェクトまで処理できるキューを処理するためにオブジェクトを追加します。
私は自分のdispatch_queueを作成し、
_concurrentQueue = dispatch_queue_create([queue_id UTF8String],DISPATCH_QUEUE_CONCURRENT);
_processSema = dispatch_semaphore_create(4);
をsemhphoreとメソッドの実装がありました:
-(void)addObjectToProcess(NSObject*)object {
dispatch_semaphore_wait(self.processSema, DISPATCH_TIME_FOREVER);
__weak MyViewController* weakSelf = self;
dispatch_async(self.concurrentQueue, ^{
// PROCESS...........
// ..................
dispatch_semaphore_signal(self.processSema);
dispatch_async(dispatch_get_main_queue(), ^{
// call delegate from UI thread
});
});
}
発信者が時々セマフォ障壁の原因をブロックされるようです。
私がここで作成しようとしているものを実装するための他の/簡単なオプションはありますか?
おかげ
ところで、セマフォの問題以外にも、コードには2つの問題があります。第一に、 'weakSelf'はあなたが望むものを達成するつもりはありません。なぜならクロージャーの中にリファレンスselfがあり、View Controllerを強く参照しているからです。だから、弱い参照は無用です。第2に、closure内の 'self'参照を' weakSelf'で置き換えるだけでは不十分です。これは競合条件を導入するためです。そのクロージャ内に新しい 'strongSelf'参照を作成する必要があります(' self'を参照するのではなく、 'weakSelf'への新しい強い参照を作成するだけです)。 – Rob