Central Grand Dispatcher: запускать один и тот же метод в разных очередях / блоках - PullRequest
0 голосов
/ 20 июля 2011

Почему мой код падает?

    dispatch_async(queue_A, ^{
    @synchronized(self) {
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
        [self logInfo:@"queue_A"];
        [pool release];        
    }
});

dispatch_async(queue_B, ^{
    @synchronized(self) {
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
        [self logInfo:@"queue_B"];
        [pool release];        
    }
});

Ответы [ 2 ]

2 голосов
/ 30 июля 2011

Вам лучше избегать использования @syncronized внутри dispatch_async, как это предлагается в комментариях.Если звонить по номеру [self logInfo:...] небезопасно, вы можете:

  1. Использовать группу рассылки, чтобы убедиться, что несколько вызовов dispatch_async() ресурса не приводят к сбою приложения.У Майка Эша есть хорошее описание этой техники .Посмотрите его примеры.
  2. Используйте семафор отправки, чтобы заставить отдельные вызовы ждать завершения друг друга.Для получения дополнительной информации см. Справочную страницу.

Я не уверен, что logInfo делает в этом контексте, поэтому вы также можете переписать это.

0 голосов
/ 20 июля 2011

Решил проблему.

Доступ к интерфейсу должен быть ТОЛЬКО через основную очередь

...