1

我有以下方法

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

我怎样才能使块同步完成它的工作,以便它在被检索之前不返回结果?

4

3 回答 3

5

您正在调用dispatch_asyncwhich 异步调度您的块。尝试使用dispatch_syncordispatch_main如果您的目标是阻塞主线程。

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

大中央调度参考

于 2011-04-13T18:36:47.870 回答
4

使用dispatch_sync而不是dispatch_async- 那么当前线程将被阻塞,直到该块在主线程上完成执行。

于 2011-04-13T18:37:28.233 回答
2

既然您似乎想在不同的线程上执行一个方法并获得一个返回值,为什么不使用 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];
于 2011-04-13T18:39:17.023 回答