1

これは非常に奇妙に思えるので、良い習慣だとは思えませんが、私は古いアプリに取り組んでおり、全体を完全に再設計せずにいくつかの更新を行う必要があります.

現在、私はアウトレットを持つUIButtonを持っています

- (IBAction) toggleBroadcast:(UIButton*) sender 
{
   // configure and start video capture
}

しかし、デバイスIDを使用してphpスクリプトを呼び出し、静的構成クラスにロードされる(解析されたJSON) NSDictionaryを返すリモート構成を実装しようとしています。

ネットワークには非同期デリゲート メソッドが必要であり、 // configure and start video captureコードはネットワークから取得したデータに依存しているため、toggleBroadcast 関数を次のようにする必要があります。

- (IBAction) toggleBroadcast:(UIButton*) sender 
    {
       // get identifier, fill request...
       // NSURLConnection* connection = [NSURLConnection connectionWithRequest:request
                                                                      delegate:self];
    }

次に、connectionDidFinishLoadingデリゲート メソッドが元のコードを呼び出しtoggleBroadcastます。このコードは個別にカプセル化されているため、適切なタイミングで呼び出すことができます。

しかし!私はそれが必要ですsender

senderでは、パラメーターとしてデリゲート メソッドに送信して、新しいメソッドに送信するにはどうすればよいですか

- (void) originalToggleBroadcastCode:(UIButton*) sender?

4

2 に答える 2

1

求めていることを達成するには、UIView を引数として受け入れる NSOperation サブクラスを作成してみてください。この操作はリクエストを実行し、完了したら UIView を更新できます。(必ずメイン スレッドで UI の更新を行ってください)。しかし、これは奇妙なデザインパターンのように思えます。

個人的には、View Controller に通知をサブスクライブさせ、ダウンロードが完了したら通知を送信します。NSNotification オブジェクトに格納されている userInfo ディクショナリに操作の成功または失敗に関する情報を格納し、適切に応答できます。繰り返しますが、必ずメイン スレッドで完了通知を送信してください。

于 2013-05-20T15:15:50.177 に答える
1

非常に優れたBlocksKit ライブラリを使用すると、次のことが可能になります。

- (IBAction) toggleBroadcast:(UIButton*) sender 
{
    NSURLConnection *connection = [NSURLConnection connectionWithRequest:request];

    connection.successBlock = ^(NSURLConnection *connection, NSURLResponse *response, NSData *responseData){
         [self originalToggleBroadcastCode:sender];

    [connection start];
 };
于 2013-05-20T15:24:28.083 に答える