0

Xcodeプロジェクトには、2つのクラスと、のサブクラスであるParentViewController別のクラスがあります。クラスでは、 と を使用して、バックエンド サーバーからデータをフェッチします。それは完全にうまく機能します。ここで、接続を確立し、バックエンドからもデータをフェッチする必要があります。しかし、 とinを追加すると、inが機能しなくなったようです。なぜだろう?ChildViewControllerParentViewControllerParentViewControllerNSURLConnectiondidReceiveDataconnectionDidFinishLoadingChildViewControllerdidReceiveDataconnectionDidFinishLoadingChildViewControllerdidReceiveDataParentViewController

didReceiveDataまた、バックエンドに送信するさまざまなリクエストconnectionDidFinishLoadingがたくさんあるよう(connect == someConnection)です。この状況を処理するためのきちんとした方法はありますか?ありがとう。

4

3 に答える 3

0

問題は、View Controllerでデータをフェッチしようとしていることです。これは、データをフェッチする必要がある場所ではありません。

フェッチするすべてのデータをモデルオブジェクトに移動します。ビューコントローラが何かを必要とするとき、モデルがそれをロードするように要求できます。そうすれば、View Controllerが画面外に出ても、モデルは正しく更新され、完了したときにViewControllerに通知できます。

通常、接続ごとに1つのモデルオブジェクトを使用できます。たとえば、サーバーデータベースから個人レコードを更新する場合、Personオブジェクトは独自のデータを要求します。次に、connectionDidFinishLoadingはその1つの接続のみを処理する必要があります。

NSOperationQueueネットワーク接続がリクエストで圧倒されるのを防ぐために、(たとえば)中央キューを介して接続を配置することもできます。ただし、各接続のデリゲートは、ビューコントローラではなく、関連するモデルオブジェクトになります。

于 2012-04-10T04:41:14.733 に答える
0

サブクラスは、ParentViewController の接続デリゲート メソッドを継承します。サブクラスで同じ動作が必要な場合は、そこにデリゲート メソッドを実装しないでください。

もう 1 つのアイデアは、デリゲート メソッドを完全に避けることです。iOS5 では、NSURLConnection は、完了のためにブロックを使用して接続を開始するためのより良い方法を提供するため、次のように、各接続のコードをコンテキスト内に配置できます。

NSURLRequest *requestA = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http..."]];
[NSURLConnection sendAsynchronousRequest:requestA queue:[NSOperationQueue currentQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
    // do what you need to do when requestA completes
}];

NSURLRequest *requestB = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http..."]];
[NSURLConnection sendAsynchronousRequest:requestA queue:[NSOperationQueue currentQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
    // do what you need to do when requestB completes
}];

アプリが多くのリモート リクエストを実行している場合は、設計を再考する必要があるという他の回答に同意します。

于 2012-04-10T04:56:22.513 に答える
0

ObjectiveC のネットワーク コードは、かなり速く圧倒される可能性があります。プロセスを簡素化するためにライブラリを使用することをお勧めします。チェックアウトhttps://github.com/AFNetworking/AFNetworking

于 2012-04-10T04:53:26.233 に答える