0

この例を見てみましょう:

int a = 1;
[someOperation onCompletion:^(...) {
     NSLog("%d", a);
}];

a = 2;

someOperation終了するのに1秒かかったとしましょう。したがって、コンソールには「2」が表示されます。

コールバックを定義したときから変数値を使用してコールバック本体を定義するにはどうすればよいですか(この場合、コールバックの実行によりコンソールに「1」が出力されます)?

JavaScriptでは、次のように実行できます。

setTimeout("someFunction("+variable+")", 1000);

それ以外の

setTimeout(function() { someFunction(variable); }, 1000);

しかし、ObjCでこのことを達成する方法は?

4

2 に答える 2

1

やってみたら

int a = 1;
int64_t delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    NSLog(@"a=%d", a);
});
a = 2;

あなたは答えが

a=1

ブロックの標準的な動作は、ブロックが作成されたときに参照する変数の値をキャプチャし、実行時にそれらの格納された値を使用することであるためです。賢い言い方があると思いますが、それが私にとってはうまくいく方法です。

于 2012-12-11T13:20:36.383 に答える
1

あなたの仮定は正しくありません。__blockキーワードで宣言されていない限り、ブロックはローカル変数をコピーします。だから、あなたの場合:

int a = 1;
[someOperation onCompletion:^(...) {
     NSLog(@"%i", a);
}];

a = 2;

NSLogステートメントは1を返します。次のように変更すると、次のようになります。

int __block a = 1;
[someOperation onCompletion:^(...) {
     NSLog(@"%i", a);
}];

a = 2;

この場合、aは参照によってアクセスされるため、2を返します。

于 2012-12-11T13:27:57.980 に答える