0

インターネット接続を有効にする必要があることを最初にユーザーに警告するための適切なアプリケーションデザインパターンを決定する際に、いくつかの問題が発生しています。

ユーザーが要求できるデータの範囲が広いため、インターネット接続が必要なiOSアプリがあります。アプリにはいくつかのタブバーコントローラーがあり、その中には、階層と返されたデータに基づいてさまざまなビューをユーザーに案内するナビゲーションコントローラーがあります。すべてのリクエストは、中央のapiリクエストクラスがリクエストを完了するかエラーを報告するのを待つNSNotificationCenterオブザーバーを使用してASIHTTPRequestを使用して非同期的に行われます。ほとんどの場合、ユーザーは少なくとも最初のリクエストをダウンロードしますが、UIAlertViewで接続を有効にしてから、他のnavコントローラーレベルをスタックからポップすることで、それらをより低いレベルに戻すようにいつでも依頼できます。接続されています。全体的に、アプリケーションはうまく機能します。

ただし、ユーザーが接続を無効にして最初にアプリケーションを開くと、問題が発生します。多くの場合、最初のサブビュー(タブバー/ナビゲーション階層の作成を容易にするためのIBoutlet)は、接続の存在をテストする前にロードを試みます。これを行う正しい方法が、他のものが何らかの方法で読み込まれる前にアプリデリゲートにタイムアウトを作成することか、重要なデータを実際に取得しない最初のテストリクエストを作成することであるかどうかはわかりません(ほぼ不可能と思われるため) 、または少なくとも、デリゲートにならずにビューを最初から完全に再初期化することは非現実的です)。

アプリケーションの初期化段階でこれを実現するために使用する簡単な方法はありますか?残りの部分はとても単純なので、私は明らかな何かを見逃しているに違いないと感じています。

誰かが私にコードを投稿してほしいと思ったら、私はできますが、これは主にアーキテクチャの質問であると確信しています。また、アプリの意図的に緩く結合された性質のため、ほとんどの場合、委任するオブザーバーを使用したいことを覚えておいてください。

これについてのご意見をお待ちしております。

4

3 に答える 3

1

あなたが示唆するように、それはアーキテクチャの問題のように聞こえます。

ロードプロセス全体が非決定的であるため、タイムアウトソリューションはせいぜい不確かだと思います。非同期でロードしているデータをどのビューに入力しているかわかりません。UITableViewしかし、それは議論のためだとしましょう。ビューが最初に読み込まれるとき、データはありません。ただし、接続が利用可能な場合は、コールバックを介してテーブルに非同期でデータを入力しASIHTTPRequestます。

例:

[[CCFConnectionManager sharedManager] countScenariosForScenarioID:lwScenario.uniqueID
                                                                groupCode:groupCode
                                                        completionHandler:^(NSInteger count) {
                                                            lwScenario.completionCount = count;
                                                            dispatch_async(dispatch_get_main_queue(), ^{
                                                                [[self tableView] reloadData];
                                                            });

したがって、完了ハンドラーで、モデルを更新してを送信します[[self tableView] reloadData]。メインスレッドの後者。HTH。

于 2011-10-11T10:45:38.857 に答える
0

私はこれを行うためにより多くの通知を使用することになりました:

「テストリクエスト」を使用してアプリデリゲートからAPIリクエストクラスを呼び出し、アプリデリゲートでもそれをリッスンします。アプリデリゲートが成功した応答を監視すると、アクティブなViewControllerがオブザーバーである別のリクエストを開始します。渡されるオブジェクトには、受信側コントローラーがビューをリロードするために必要なデータが含まれています。

次回は、通知の一部を廃止するために、委任をもう少し計画する必要があると思います。ただし、同じクラスが動的に使用され、複数のデータセットを受信できる、またはデータが異なるコンテキストを対象としているこのようなアプリケーションでは、通知はある程度意味があると思います。

于 2011-10-12T09:30:37.360 に答える
0
-(BOOL)isConnected{
BOOL connected;
const char *host = "www.google.com";
SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, host);
SCNetworkReachabilityFlags flags;
connected = SCNetworkReachabilityGetFlags(reachability, &flags);
BOOL isConnected = connected && (flags & kSCNetworkFlagsReachable) && !(flags & kSCNetworkFlagsConnectionRequired);
CFRelease(reachability);
return isConnected;}

このメソッドはアプリデリゲートを追加します。

于 2011-10-12T09:56:55.623 に答える