0

私はiOSのブロックに不慣れで、それらを使用する正しい方法を見つけようとしています。これが私の設定です:

操作( )が成功しfooたかどうかを返すメソッドがあります。RKObjectRequestOperation成功のブロックと失敗のブロックを操作に提供するので、成功のブロックではfooYESを返し、失敗のブロックではfooを返しNOます。

例えば:

- (BOOL) foo {
    RKObjectRequestOperation *request = [[RKObjectRequestOperation alloc] initWithRequest:urlRequest responseDescriptors:responseDescriptors];

    [request setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
        NSLog(@"Success!");
        // return YES?
    } failure:^(RKObjectRequestOperation *operation , NSError *error) {
        NSLog(@"Failure!");
        // return NO?
    }];

    [request start];
}

ただし、私が知る限り、ブロックはそれ自体の値しか返すことができません。それを呼び出しているメソッドを返すことはできません。これは正しいです?この場合、私が考えることができる唯一のことfooは、操作の成功または失敗時に呼び出されるパラメーターとして別のブロックを取得することです。これに伴う問題は、'foo`から呼び出しスタックを上げると、return型を持つメソッドを変更してvoidを返し、代わりに呼び出すパラメーターとしてブロックを受け入れる必要があることです。これらすべての方法を変更しなければならないのは過剰のようです。概念的に何かが欠けていますか?

4

1 に答える 1

7

あなたが見逃しているのは、このブロックが(おそらく1)非同期的に呼び出されるという事実です。これは完了ブロックであるため、要求された操作が完了するまで起動されません。これは並行操作です。したがって、ブロックが起動するまでに、-fooメソッドはすでに呼び出し元に戻っており、おそらくrunloopに戻って、他の処理を開始しています。

-foo基本的に、これは、ブロックがまだ起動されていないため、ブロックに基づいて何も返すことができないことを意味します。-fooメソッド自体を非同期にするように再設計する必要があります。

1私はよく知らないRKObjectRequestOperationが、完了ブロックは非同期コンテキストでのみ意味があります。

于 2013-03-20T19:05:32.840 に答える