ブロック内の int の値を変更しようとしています。(このコード例では、SLRequest 自体は完全なアプリからのコンテキスト設定のみであり、ここで動作することは期待されていません。int の設定をテストできるように、コンパイルして実行するだけです。このためには、Socialframework をプロジェクトに含める必要があります。コンパイルする例。出力は以下に含まれています。)
#import "MainViewController.h"
#import <Social/Social.h>
@interface MainViewController ()
@end
@implementation MainViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// This SLRequest stuff is just to provide the context for the block in question below
NSString * theURLstr = @"http://someurl";
NSURL * theNSURL = [[NSURL alloc] initWithString:theURLstr];
SLRequest *theRequest = [SLRequest requestForServiceType: SLServiceTypeFacebook requestMethod:SLRequestMethodGET URL:theNSURL parameters:nil];
[theRequest setAccount:nil]; //
// This is our test value. We expect to be able to change it inside the following block
__block int test = 44;
NSLog(@"(BEFORE block) test is: %d", test);
[theRequest performRequestWithHandler:
^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error2)
{
// We get here late.
test = 27;
NSLog(@"(INSIDE block) test is: %d", test);
}];
// We get here fine, but test isn't changed
NSLog(@"(AFTER block) test is: %d", test);
}
// --- 出力:
2013-02-10 19:13:53.283 debugExp1[92743:c07] (BEFORE block) test is: 44
2013-02-10 19:13:53.285 debugExp1[92743:c07] (AFTER block) test is: 44
2013-02-10 19:13:53.312 debugExp1[92743:1303] (INSIDE block) test is: 27
順不同の出力行に注意してください。中間を実行する前に開始および終了します。どうすればこれを修正できますか? その場所の int 値を変更し、ブロックの外で使用できるようにしたいだけです。
===更新===
この質問の複数の接線バージョンをオンラインで見つけていますが、私の目的には使用できない形式になっています。だから多分私は答えられない方法で私の質問を提起しています. コンテキストを追加してみましょう。
私のアプリは、Twitter で指定されたさまざまな種類の複数の Twitter API 呼び出しからデータを収集しています。表示用のテーブルを作成していません。ivar 内のデータと、最終的に管理対象オブジェクトが必要なだけです。アプリは Twitter データを取得するだけでなく、多くのことを行う必要があるため、ある時点で返されたデータにアクセスできるようにするためだけに、1 つの performRequestWithHandler ブロック内にアプリの構造をあまり多く入れたくありません。私にとって、ネットからデータを取得することはユーティリティ操作であり、アプリの設計を決定する唯一の要因ではありません。一部の API 呼び出しは、以前に特定の順序で実行された他のタイプの API 呼び出しから収集されたデータに特に依存しています。
データ オブジェクトから設定した ivar 値を使用できるように、以前の呼び出しがいつ終了したかを知る必要があります。
つまり、API 呼び出し #1 を作成し、さまざまな戻りデータを ivar に割り当て、performRequestWithHandler ブロックの外側で ivar を使用して他のことを行い、呼び出し #1 に基づいて API 呼び出し #2 および #3 を作成する方法が必要です。および後続の API 呼び出しが返され、最終的に他の viewController にシャッフルして、複数の API 呼び出しの戻り値から処理されたデータをさまざまな方法で表示します。
performRequestWithHandler が未指定のスレッドで実行され、いつ実行されるかわかりません。非常に短い待機時間を指定するつもりなので、同期されたネットワーク アクセスの遅延による UI の長い待機については心配していません。遅いネットワーク接続を待つためにユーザーを座らせるつもりはありません! 接続が遅い場合は、アクティビティ インジケーターを短時間表示し、アラートが表示されるまですぐに待つことをあきらめます。アプリのその部分は、ここで焦点を当てた私の課題ではありません。
私の課題は、複数の performRequestWithHandler 呼び出しから返されたデータを、それらの一部またはすべてが終了した後で 1 か所に集めることです。
performRequestWithHandler は、必要な種類の同期制御とデータ アクセスを実現するには高レベルの呼び出しである可能性があるように思えます。知らない。
上記のコード例は、コンパイルする簡単な方法で問題を分離して実証するために考えられる最も簡単な方法にすぎません。私は多くの変種を試しましたが、今のところ喜びはありません.
これが、私が取り組んでいるデザインのアイデアを明確にするのに役立つことを願っています.
あなたが提供できるかもしれない特定の助け、手がかり、またはアイデアをありがとう。ごくわずかな作業コード サンプルは、現時点では天の恵みですが、引き続き作業を続け、見つけた場合は解決策を投稿します。