6

iOS 開発は初めてなので、フィードバックをいただければ幸いです。

Web サービス用の iOS クライアントを構築しようとしています。これまでのところ、これは私がやったことです:

2 つのビュー (ストーリーボードを使用したユーティリティ ベースのアプリ) を実装しています。メイン ビューでは、ユーザーがクエリを入力して検索ボタンをクリックできるテキスト フィールドと検索ボタンを使用します。検索ボタンをクリックしたら、テキスト フィールドの値を読み取り、それを Web サービスへの Restful 呼び出しで使用するつもりです。私の Web サービスは、クエリ結果を含む JSON ファイルを返します。これを解析して、セカンダリ ビューのテキスト領域に表示します。

iOS で安静な呼び出しを行う方法と、JSON 解析を行う方法、および画面に結果を表示する方法 (少なくともテキストのものですが、それは別の質問です) を知っています。しかし、私の意図は、MVC の基本を学び、アプリケーションに実装することです。

MVC に従って、コントローラーはビューを更新し、モデルはコントローラーがリッスンしてオブジェクトに変更があるかどうかを知ることができる通知ブロードキャストを送信します。だから、これは私が理想的にやりたいことです:

My Model - 私のモデルは、コア RESTful 呼び出しを処理し、JSON 応答を取得して解析し、ビューに表示する結果の値を取得します。

My Controller - コントローラーでモデルをリッスンし、Model から結果の値を取得して View に表示したいと考えています。

手早く汚い方法を使用して、RESTful 呼び出し、JSON の解析、および結果の値の表示をすべてコントローラー内で実装できますが、この手法を使用すると、明日ビューが変更された場合、コードを書き直す必要があります。または、新しい機能を追加したい場合は、コントローラーを変更する必要があります。したがって、理想的には、ビューがどのように見えるかを認識しないコア モデルが必要であり、コントローラーがモデルから結果を取得してビューに表示するようにします。

これまでに Google の検索結果から読み取ったことによると、これを行う 2 つの方法は、a) Key Value Observation と b) 通知センターです。

過去 2 日間、私は通知センターを実装する適切な方法を見つけようとしています。私が持っている質問のいくつかは、コントローラーがピックアップする通知センターを使用して文字列結果の値を送信できますか? 通知センターは文字列値を実際にどのように処理しますか? 良い例をどこで見つけることができますか?

したがって、これに関するヘルプは非常に高く評価されます。

4

2 に答える 2

12

私が持っている質問のいくつかは、コントローラーがピックアップする通知センターを使用して文字列結果の値を送信できますか?

はい、それは一般的userInfoに a のプロパティを使用して行われますNSNotification。プロトコルに準拠しているキーによってインデックス付けされた派生オブジェクトのインスタンスを含む可能性userInfoのあるプレーンです (一般的に使用されます)。ディクショナリ ( ) はパラメータ オブジェクトを保持することに注意してください。NSDictionaryNSObjectNSCopyingNSStringuserInfo


通知センターは文字列値を実際にどのように処理しますか?

まあ、それはあなたがそれをどのように機能させたいかによって異なります。しかし、細かいことはさておき、以下を参照してください。


良い例をどこで見つけることができますか?

たぶんこれが役に立ちます...


受信者 (コントローラー) は通知を登録します。

- (void)registerForNotifications
{
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(modelObjectUpdatedString:)
                                                 name:@"StringUpdated"
                                               object:nil];
}

送信者 (モデル) は世界に通知します。

- (void)stringUpdateWith:(NSString *)theString
{
    self.string = theString;
    [[[NSNotificationCenter defaultCenter] postNotificationName:@"StringUpdated" 
                                                         object:self 
                                                       userInfo:[NSDictionary dictionaryWithObjectsAndKeys:self.string, @"String", nil]];
}

受信者 (コントローラー) は、そのハンドラー内で通知を受け取ります。

- (void)modelObjectUpdatedString:(NSNotification *)notification
{
    ModelObject *postingObject = [notification object];
    NSString *string = [[notification userInfo]
        objectForKey:@"String"];
    ...
}
于 2012-04-15T23:37:43.097 に答える
4

あなたは正しい道に沿って考えていますが、それでも完全ではありません。Tillがコメントで「指摘」しているように、モデル内でRESTful通信を処理するべきではありません。私があなたなら、情報の取得を担当するユーティリティクラスを作成し、次にデータの保持を担当するクラスを作成します(この最後のクラスはあなたのモデルです)。

RESTfulコミュニケータークラスを介してフェッチされたJSONデータから作成された、このオブジェクトの新しいインスタンスを割り当てて開始するクラスメソッドを作成するのが賢明です。

コントローラの観点から:

RESTHelper *rest = [RESTHelper restHelperWithURL:yourRESTURL];
YourModel *model = [YourModel modelWithJSON:[rest fetchObjectWithID:1]];
// Present your models data in the view.

ここでCoreDataを使用することでメリットが得られる可能性があります。そのため、調査することを強くお勧めします。

于 2012-04-15T23:43:41.523 に答える