Цель C - заблокировать вопрос? - PullRequest
1 голос
/ 13 апреля 2011

У меня есть следующий метод

+ (NSString*)getMeMyString
{
   NSString *result;
   dispatch_async(dispatch_get_main_queue(), ^{
        result = [ClassNotThreadSafe getString];
    });
   return result;
}

Как сделать так, чтобы блок выполнял свою работу синхронно, чтобы он не возвращал результат до его получения?

Ответы [ 3 ]

5 голосов
/ 13 апреля 2011

Вы звоните dispatch_async, который отправляет ваш блок асинхронно.Попробуйте использовать dispatch_sync или dispatch_main, если ваша цель - заблокировать основной поток.

+ (NSString*)getMeMyString
{
   __block NSString *result;
   dispatch_sync(dispatch_get_main_queue(), ^{
        result = [ClassNotThreadSafe getString];
    });
   return result;
}

Grand Central Dispatch Ссылка

4 голосов
/ 13 апреля 2011

Используйте dispatch_sync вместо dispatch_async - тогда текущий поток будет заблокирован, пока не завершится выполнение блока в основном потоке.

2 голосов
/ 13 апреля 2011

Поскольку кажется, что вы хотите выполнить метод в другом потоке и получить возвращаемое значение, почему бы вам не использовать NSInvocation?

SEL theSelector;
NSMethodSignature *aSignature;
NSInvocation *anInvocation;

theSelector = @selector(getString);
aSignature = [ClassNotThreadSafe instanceMethodSignatureForSelector:theSelector];
anInvocation = [NSInvocation invocationWithMethodSignature:aSignature];
[anInvocation setSelector:theSelector];

NSString *result;

[anInvocation performSelectorOnMainThread:@selector(invoke) withObject:nil waitUntilDone:YES];
[anInvocation getReturnValue:result];
...