0

オーケー諸君。これは少し初心者かもしれませんが、私が持っているヘルパークラスで NSURLConnection デリゲートをトリガーする方法を理解するのに苦労しています。

質問は次のとおりです。

Web サービスへのログインを実行する ViewController があります。ビューから「接続」オブジェクトをセットアップします。

接続クラスでは、リクエスト オブジェクト (NSMutableURLRequest *request) をセットアップします。

次に、接続をセットアップします。

NSURLConnection *connection=[[NSURLConnection alloc] initWithRequest:request delegate:self];
if (connection) {

    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
    dataWebService = [NSMutableData data];
    [connection start];
} else {
    // Inform the user that the connection failed.
}

手がかりは、View Controller 内の ViewController クラスでこれを行う (すべてのデリゲートを配置する) と、デリゲートが自動的にトリガーされ、Web サービスにログインできることです。

「接続クラス」内のビューコントローラーからこれらのデリゲートを呼び出すにはどうすればよいですか?

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
- (void)connectionDidFinishLoading:(NSURLConnection *)connection

この接続クラスを使用して、他のビューからも他のタスクを実行するため、これが必要です。そして、私が持っているすべてのビューにこれらのデリゲートを書くのは少しやり過ぎです。

4

3 に答える 3

0

downloadFromURL:sender:のような接続クラスに、任意のクラスから呼び出すことができるメソッドを含めることができます。それを呼び出すときは、URLを指定し、送信者引数としてselfを指定します。接続クラスには、sendingObjectなどのプロパティがあり、senderに設定します。

-(void)downloadFromURL:(NSURL *) url sender:(id) sender {
    _receivedData = [[NSMutableData alloc] init];
    sendingObject = sender;
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL: url cachePolicy: NSURLCacheStorageAllowedInMemoryOnly timeoutInterval: 30.0];
    [NSURLConnection connectionWithRequest:request delegate:self];
}

このクラスにすべてのデリゲートメソッドを実装し、connectionDidFinishLoading:メソッドで、次のようなことを行うことができます。

-(void) connectionDidFinishLoading:(NSURLConnection *)connection {
    [sendingObject performSelector:@selector(resultFromDownloader:) withObject:_receivedData];
}

これにより、(resultFromDownloader :)でデータを処理できるようになりますが、このメソッドを呼び出すクラスでは処理する必要があります。

于 2012-11-27T00:50:20.260 に答える
0

デリゲートを完全に避けるのはどうですか?iOS5 以降では、接続を実行し、次のようにブロックで応答を処理できます。

[NSURLConnection sendAsynchronousRequest:request 
                                   queue:[NSOperationQueue mainQueue]
                       completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
        // handle response, data and error here
    }];

このメソッドを使用すると、1 つのクラスで NSURLConnection に応答し、別のクラスでそれをブロックで実行できます。または、接続を作成し、パラメーターとして渡されたブロックを使用して実行するクラスを作成できます。

于 2012-11-27T03:19:12.570 に答える
0

NSURLConnection とそのデリゲート メソッドを必要な場所に配置するのはやり過ぎだと言うかもしれませんが、それは間違いなく最もクリーンなソリューションです。

デリゲートを使用する場合、1 つの送信者 (この場合は NSURLConnection) と 1 つの受信者 (この場合は ViewController) が必要です。あなたがしたいことは、その受信機を常に変更するか、複数の受信機を用意することです。私には完全にはわかりません。できるよ。NSURLConnection を再利用したい (したがって、1 つのレシーバーを保持する) 場合は、そのデリゲートをその時点で必要なクラスに変更するだけです。これは、追跡するのが難しい場合があります。1 つの接続だけの結果を他のクラス (複数のレシーバー) に渡したい場合は、デリゲート メソッドを 1 回実装し、NSNotifications を使用して、オブザーバーとして登録されているすべてのクラスに結果を送信できます。ただし、通知は値を返すことができません。

于 2012-11-26T22:24:13.833 に答える