0

ここでは、デリゲートとコールバックに関するいくつかの概念を理解しようとしています。基本的に、私は郵便番号に基づくhttp-requestを作成しようとしています。そのため、http-requestを作成する前に、ロケーションマネージャーを呼び出して郵便番号を取得しますが、そのような期間中は、非同期でそのタスクを完了し、フィードバックを取得する必要があります。ここでの懸念は、location-managerから設定したデリゲートには、http-requestクラスとのリンクがないことです。そのため、デリゲートからhttp-requestに情報を返す方法を理解しようとしています。私はブロックを調べていましたが、とにかく、デリゲートの応答を待つことができるブロックがありますか?または、非同期タスクでBOOLプロパティとして設定することもできます。完了すると、リクエストがトリガーされます。私はGCDを除いてブロックをあまり試していなかったので、それでもこれを回避しようとしています。

ここでの提案を歓迎します。

4

3 に答える 3

2

委任では、ロケーションマネージャーのプロトコルとhttp rquestコントローラーによって定義されたプロトコルの両方に準拠する1つのコントローラー(ビューコントローラーの場合もあります)があります。

ビューコントローラは両方のオブジェクトを作成し、それ自体を両方のデリゲートとして割り当てます。
これは、ロケーションマネージャーに郵便番号を取得するように指示します。マネージャーが完了すると、デリゲートに適切なデリゲートメソッドを送信します[self.delegate didFindZipCode:code onLocationManager: self]。デリゲートはViewControllerであるため、このメソッドを実装します

-(void)didFindZipCode:(NSString *)code onLocationManager:(MyLocationManager *)manager 
{
    [self.httpRequestController sendZipCode:code];
}

リクエストコントローラーは、必要なデータが利用可能になるとすぐに、同様の方法でビューコントローラーに通知します。


実際には、ブロックは同様の方法でこれを処理します。デリゲートが設定されていないため、呼び出される必要がありますが、コードが渡され、何かが発生するとすぐに呼び出されます。

于 2012-12-18T18:04:35.347 に答える
2

これがスケッチです-(エラー状態と位置データのキャッシュの問題を無視します)。これはすべてviewControllerに入る可能性があります。郵便番号を取得するためのブロックは1つありますが、残りのブロックは、必要に応じてデリゲートを介して実行できます。

//initialise locationManager once (eg in viewDidLoad)
- (void) initialiseLocationManager
{
    CLLocationManager* locationManager = [[CLLocationManager alloc] init];
    [locationManager setDelegate:self];
    [locationManager setDesiredAccuracy:kCLLocationAccuracyKilometer];
    [locationManager setDistanceFilter:500];
    self.locationManager = locationManager;
}

//[self startLocating] whenever you want to initiate another http-request
- (void) startLocating
{
    [self.locationManager startUpdatingLocation];
}

//locationManager delegate method
//this will get triggered after [self startLocating] 
//when a location result is returned
- (void)locationManager:(CLLocationManager *)manager
     didUpdateLocations:(NSArray *)locations
{
    CLLocation* location = [locations lastObject];
    CLGeocoder* geocoder = [[CLGeocoder alloc] init];
    [geocoder reverseGeocodeLocation:location
                   completionHandler:^(NSArray *placemarks, NSError *error){
                       CLPlacemark* placemark = [placemarks objectAtIndex:0];
                       NSString* zip = [placemark postalCode];

        /*
        implement your http-request code here using the zip string
        there are various ways to do this 
                    but two ways your result will arrive...

        1 - as a delegate callback
        so you would implement the relevant delegate method 
                    (in this same viewController) to use the result

        2 - as a completion block 
        so your result-using method would be that block
        */

    }];
    [self.locationManager stopUpdatingLocation];
}
于 2012-12-18T20:01:31.570 に答える
0

実装が非常に簡単なAFNetworkingと呼ばれるすばらしいライブラリが利用可能です。

ブロックを使用します。これにより、クラス間のデータの通信が非常に簡単になります(デリゲートがなくなります)。

于 2012-12-18T17:39:24.917 に答える