Как я могу получить возвращаемое значение из блока завершения? - PullRequest
22 голосов
/ 08 декабря 2011

Можно ли запустить блок завершения в главном потоке?

Например, у меня есть один метод, который возвращает значение:

- (int)test
{

    /* here one method is called with completion block with return type void */

    [obj somemethodwithcompeltionblock:
      {
         /* here I am getting my Int which I want to return */
      }
      ];
}

но я не вижу, как вернуть целочисленное значение из блока завершения как результат этого метода, потому что блок завершения выполняется в фоновом потоке.

Как я могу это сделать?

1 Ответ

29 голосов
/ 08 декабря 2011

Вам не хватает некоторых основ асинхронной разработки с блоками.Вы не можете получить отправленный блок откуда-либо, кроме своей области видимости.Думайте о каждом блоке как о своем собственном методе, а не о встроенном коде.

Я думаю, что вы ищете что-то похожее на это ...

- (void)testWithHandler:(void(^)(int result))handler
{
    [obj somemethodwithcompeltionblock:^{
            int someInt = 10;
            dispatch_async(dispatch_get_main_queue(), ^{
                handler(10);
            });
      }
      ];
}


- (void)callSite
{
    [self testWithHandler:^(int testResult){
        NSLog(@"Result was %d", testResult);
    }];
}
...