web-dev-qa-db-ja.com

完了ブロックから戻り値を取得するにはどうすればよいですか?

メインスレッドで完了ブロックを実行することは可能ですか?

たとえば、値を返すメソッドが1つあります。

- (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 */
      }
      ];
}

しかし、完了ブロックはバックグラウンドスレッドで実行されるため、このメソッドの結果として完了ブロック内から整数値を返す方法がわかりません。

これどうやってするの?

22

ブロックを使用した非同期開発に関するいくつかの基本が欠けています。ディスパッチされたブロックを、それ自体のスコープ以外の場所から返すことはできません。各ブロックは、インラインコードではなく、独自のメソッドと考えてください。

あなたが探しているのはこれに似たものだと思います...

- (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);
    }];
}
29
Joshua Weinberg