1. Objective C / Говнокод #14403

    −131

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    [self
            performSelectorOnMainThread: @selector(_blockCaller:)
            withObject: ^{
                [self _reportAchievement:achievement listener:listener];
            }
            waitUntilDone: YES
        ];
    
    <...>
    
    - (void) _blockCaller:(void(^)())blockHandler {
        blockHandler();
    }

    GCD не в моде.

    Запостил: krypt, 23 Января 2014

    Комментарии (5) RSS

    • очень похоже на код для cocos2d => вполне нормальное явление - там все построено на блоках
      Ответить
      • Так дело в том, что это можно сделать в блоках целиком, а не используя performSelector
        Ответить
    • Вообще-то тут идет синхронный вызов (waitUntilDone:YES). Использовать dispatch_sync нельзя, т.к. он dead-лочит главный поток при вызове на этом самом главном потоке.
      А вот performSelectorOnMainThread эту проблему решает.
      > If the current thread is also the main thread, and you specify YES for this parameter, the message is delivered and processed immediately.

      Написано, конечно, не очень красиво, но стоит все-таки подучить матчасть.
      Ответить
      • Можно с доп. проверкой:

        dispatch_queue_t main = dispatch_get_main_queue();

        if (dispatch_get_current_queue() == main)
        block();
        else
        dispatch_sync(main, block);
        Ответить
    • А что мешает использовать dispatch_async а потом обратится в главному по завершению?
      Ответить

    Добавить комментарий