2

xcodeでの作業私は、非voidメソッドを作成する場合、それをクラス/メソッドから呼び出すと、アクションが即時である場合にのみ結果が最適に処理されることに気付きました。遅延を挿入してテストを試みましたが、機能しなくなったことに気づきました。私が作成した例をここに書き留めます。

クラスA

//--------------------CLASS A
- (void)viewDidLoad {
   [super viewDidLoad];
   i = 0;
   Class *classB = [[Class alloc] init];
   i = [classB method1];
   [self performSelector:@selector(method3) withObject:NULL afterDelay:1.8];
}

-(void)method3 {
   NSLog(@"i = %i",i); // i = 0
}

クラスB

//--------------------CLASS B    
-(int)method1 {
  [self performSelector:@selector(method2) withObject:NULL afterDelay:1];
  return a;
}

-(void)method2 {
  a = 800;
}

明らかに私の問題はそれほど些細なことではありませんが、できるだけ徹底的に答えを得るように努めました。モーダルメソッドを使用するようにアドバイスされましたが、それが私が探していた解決策ではないと思います。

これを解決するために私は何ができますか?!

4

2 に答える 2

2

これを解決するために私は何ができますか?!

値をどこに戻しますか?あなたの例では、が呼び出されるmethod1ずっと前に完了します。method2によって計算された値を保持する場合method2は、通常、そのメソッドに値をClassBのインスタンス変数の1つに格納させ、場合によっては他のメソッドを呼び出して処理を続行します。

からの結果を本当にmethod1返す必要がある場合method2は、同期的に(つまりなしで)呼び出す必要があります-performSelector:withObject:afterDelay:。この場合、a)遅延が必要な理由を検討してください。method1b)おそらく、の代わりに遅延後に電話をかける必要がある場合method2

あなたが解決しようとしている現実の問題が何であるかを説明できれば、私たちははるかに良い助けを提供することができます。

于 2012-05-26T15:42:20.830 に答える
2

本当に必要なのは、非同期メソッドをよりよく理解することです。ではmethod1、変数aが変更されることはありません。実行しているのは、将来呼び出されるようにスケジュールmethod2してから、変数の現在の状態を返すことだけですa

Objective-Cでは、この問題を解決するためのいくつかの異なる方法があります。人々は最も一般的にこの問題を使用protocolsdelegatesて解決します。これがプロトコルとデリゲートの基本的な紹介です。基本的に、クラスAオブジェクトをクラスBオブジェクトのデリゲートにする必要があります。NSNotificationsまたはブロックを使用することもできますが、通知とブロックに進む前に、プロトコルとデリゲート(Objective-Cでは非常に重要です)の使用法を理解する必要があります。

于 2012-05-26T15:46:48.780 に答える