1

私はしばらくこれに取り組んできました、そして私は私の論理を設計するのにいくらかの助けが必要です。

この順序で3つのことを実行したい1)ユーザーの場所を取得する2)そのユーザーの場所でWebサービスを呼び出す3)ユーザーインターフェイスに結果をロードする

結果を簡単に更新できるように設計したいので、ユーザーが更新ボタンを押した場合は、手順1〜3をもう一度実行します。

今は次のようにしています。これは私のViewControllerのコードです。

- (void) viewDidLoad {
    //initialize CLLocationManager
    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    self.locationManager.delegate = self;
    [self.locationManager startUpdatingLocation];

- (void) locationManager: (CLLocationManager *)manager 
     didUpdateToLocation: (CLLocation *)newLocation
            fromLocation:(CLLocation *)oldLocation
{
    if (oldLocation!= nil) { // make sure to wait until second latlong value
        [self setLatitude:newLocation.coordinate.latitude];
        [self setLongitude: newLocation.coordinate.longitude];
        [self.locationManager stopUpdatingLocation];
        self.locationManager.delegate = nil;
        [self makeUseOfLocationWithLat:[self getLatitude] andLon:[self getLongitude]];
}

- (void) makeUseOfLocationWithLat: (double) lat andLon: (double) lon {
    // call web service
    [self loadUI];
}

- (void) loadUI {
     // loads the user interface
}

私が間違っている場合は私を訂正してください、しかし私のデザインは本当に悪いです。モジュール式ではなく、各メソッドは相互に関連付けられています。また、モデルクラスではなく、ViewControllerで集中的なWebサービス呼び出しを行っています。これをどのように適切に設定しますか?私が抱えている大きな問題の1つは、緯度と経度の変数がいつ値を取得するかわかりません。デリゲートメソッドからmakeUseOfLocationを呼び出さないと、緯度と経度の値がnilのmakeUseOfLocationを呼び出すことになります。

私は自分のロケーション管理、NSKeyValueObserving Protocols、dispatch_queues、NSOperationsのシングルトンを調べましたが、iOSでの開発は初めてであり、何をしようとしてもどこかで行き詰まっています。これを設定する方法についてのあなたの考えを教えてください。

お時間をいただき、誠にありがとうございます。

4

1 に答える 1

1

本当に分離したい場合は、簡単な最初のステップとして、次のようにします。

  • LocationTrackerのような新しいクラスを作成します
  • LocationTrackerをCLLocationManagerのデリゲートにします(おそらくそのinitメソッドで)
  • LocationTrackerにNSNotification「myapp.location.refresh」をサブスクライブさせます
  • ViewControllerに「myapp.location.updated」をサブスクライブさせます
  • CLLocationManagerがdidUpdateを提供したら、「myapp.location.updated」を公開します
  • 更新ボタンが押されたら、「myapp.location.refresh」を公開します
  • 「myapp.location.refresh」が通知されたら、強制的に更新します

これにより、位置追跡クラスとコントローラーの間に小さなプロトコルが作成されます。NSNotificationのドキュメントは非常に優れており、そこにたどり着きます。

コントローラにインスタンスまたはアプリケーションデリゲートを所有させることができます。シングルトンは本当に必要なものではないと思います。

Key-Value監視、またはプロトコル/デリゲートタイプのセットアップを使用することもできます。これらはすべて基本的に同じパターン(オブザーバー)であるため、いずれも機能します。

于 2012-07-20T22:32:40.283 に答える