0

そこで NSMutableArray を返せない理由を誰か教えてください:

-(NSMutableArray)makeServiceRequest:(UIViewController *)sender
{
     NSMutableString *urlString= [NSString stringWithFormat:@"http://www.servicedata/%@", _searchValue];

     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSData* data = [NSData dataWithContentsOfURL:
                        [NSURL URLWithString: urlString]];

        NSError* error;

        NSMutableArray *json = [NSJSONSerialization JSONObjectWithData:data
                                                               options:kNilOptions
                                                                 error:&error];

        dispatch_async(dispatch_get_main_queue(), ^(){
            NSLog(@"json arrived");
            return json;
        });
    });
}

ヘッダーファイルで適切に宣言しました。それをクラスメソッドに変える方法はありますか?

4

4 に答える 4

3

jsonあなたの関数が(NSMutableArray *)戻る間です(NSMutableArray)

于 2012-06-01T16:04:10.820 に答える
3

これを行うことはできません。ブロックをディスパッチすることは、別のスレッドを作成してそれを手放すことと同じです。ブロックが実行されるまでに、メソッド makeServiceRequest はすでに実行されており、スコープ内にありません。必要なことは、呼び出し元に要求を通知することです。プロトコルまたは通知を介して行われます...フローは次のようになります

  • 呼び出し元がメソッドを呼び出す
  • メソッドが実行され、別のスレッドでブロックが開始され、戻ります
  • 発信者は自分の仕事を続けます
  • 最終的にブロックが実行され、呼び出し元に戻るには、プロトコルまたは通知のいずれかを使用する必要があります (他の方法もありますが、これらの 2 つが最適です)。

NSNotifications について知りたい場合は、この質問をチェックしてください

于 2012-06-01T16:04:43.630 に答える
1

その return ステートメントはブロック内にあります。ブロックは、それ自体の一種の機能と考えてください。ブロックには、関数やメソッドと同様に、引数と戻り値の型があります。dispatch_async は引数を取らず、戻り値の型も持たないため、そのブロック内で返そうとするのは好きではありません。

また、そのブロックはおそらく次の実行ループで実行されます。コードが実行されるまでに makeServiceRequest: メソッドを終了しており、そのメソッドからは何も返されません。そのコードには、「コントロールが非無効関数の終わりに到達しました」などの警告があると思います。

于 2012-06-01T16:06:24.223 に答える
-1

アニラ説明したように、あなたは * を逃しました。これが何を意味するのかを理解するには、Objective-C に関する「はじめに」を読む必要があります。たとえば、Objective-C に関する Apple の入門チュートリアル: Learning Objective-C: A Primer

とにかくそれをクラスメソッドに変える方法はありますか?

そして、2 番目の質問に答えるために、私が正しければ、先頭のダッシュをプラスに変更する必要があります。これは、Java のキーワード「static」に相当します。

+ (NSMutableArray*)makeServiceRequest:(UIViewController *)sender
于 2012-06-01T16:04:38.373 に答える