1

現在、UIViewController と NSObject クラスがあります。

私がやりたいことは、NSObject クラスにアクションを実行するように指示し、UIViewController にアクションが終了したことを伝えることです。

オブジェクトを呼び出して、次のようにアクションを実行します。

[fooObject performActionWithDelegate:self];

performActionWithDelegate 関数は、基本的に UIViewcontroller のデリゲートのみを使用してコールバックを実行します。

-(void)performActionWithDelegate:(id)d{

    // bar is declared in the fooObject header file
    // id bar;

    [bar setDelegate:d];

    [bar performCallback];

}

performCallbackUIViewControllerの単純なNSLog()-statementはどこにありますか:

-(void)performCallback{

    NSLog(@"Successfully performed a callback");    

{

さて、これを機能させたいと思います。私の最初の推測では、これはこの問題に対する最善のアプローチではありません。

問題の全範囲は、fooObject が Web サービスに対して httppost を実行してそのプロパティの 1 つを更新し、操作が成功したかどうかを uiviewcontroller に通知することになっていることです。

どうすればこれを達成できますか?

ヒントや指針をいただければ幸いです。

前もって感謝します。

編集: 実際の問題は、fooObject がコールバックを実行していないことです。

4

1 に答える 1

0

何を達成しようとしているのか正確にはわかりません。あなたがしていることは、2つの異なるデザインパターンに関連しているようです。

  • 委任
  • 非同期コールバック

デリゲート: UIViewControllerの機能の一部を別のオブジェクトに分離する理由がある場合は、デリゲートを使用します。UIViewControllerが何かを実行する代わりに、別のオブジェクトにそれを実行するように要求します。これは一般的にコードの再利用に使用されるため、同じUIViewControllerをさまざまなケースで提供し、デリゲートを変更するだけでその動作の一部を変更できます。

非同期コールバック:これにより、他のことをしているときにバックグラウンドで操作を実行し、操作の完了時にオブジェクトのメソッドを呼び出すことで通知を受けることができます。他のオブジェクトを使用せずにこれを行うことができます。

あなたの場合、なぜUIViewControllerの外部のWebサービスにHTTPポストを実行したいのですか?ネットワークコードをUIコードから分離したいだけですか?この場合、実際にはデリゲートは必要ありません。UIViewControllerから他のオブジェクトのメソッドを呼び出すだけで、戻ってきたら完了です。他のパラメータで必要な結果を返すことができます。呼び出し元のオブジェクトにプロパティを設定して値を返すことは、一般的にあまり良い設計ではありません。これを行っても、UIViewControllerは実際には「デリゲート」ではありません。

一方、HTTP POSTの処理中にメインスレッドをブロックすることが懸念される場合は、非同期コールバックなどを使用することをお勧めします。これを行う最も簡単な方法は、GrandCentralDispatchを使用することです。概念的には、次のようなことができます。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
  [self doLongHTTPPost];
  dispatch_async(dispatch_get_main_queue(), ^{ [self longHTTPPostDone]; });
});

これはdoLongHTTPPostバックグラウンドで呼び出され、完了後しばらくしてlongHTTPPostDoneから、UIアクションを安全に実行できるメインスレッドを呼び出します。

于 2012-07-10T07:41:35.440 に答える