1

私は次の方法を持っています

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

ブロックを同期的に実行して、取得される前に結果が返されないようにするにはどうすればよいですか?

4

3 に答える 3

5

dispatch_asyncブロックを非同期的にディスパッチする呼び出しを行っています。dispatch_syncまたはdispatch_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 に答える