0

我想在这里理解一些关于委托和回调的概念。基本上我正在尝试制作一个基于邮政编码的http请求。因此,在发出 http-request 之前,我会调用 location-manager 并获取邮政编码,但是,在此期间,我必须等待异步完成该任务并获得反馈。这里的问题是,我从 location-manager 设置的委托与 http-request 类没有链接。所以,我试图了解如何将信息从委托传递回 http-request。我正在研究区块,但无论如何,您是否可以等待代表的回应?或者也可以在异步任务中设置为 BOOL 属性,完成后触发请求。除了 GCD 之外,我没有尝试过很多块,所以仍然试图解决这个问题。

我欢迎在这里提出任何建议。

4

3 回答 3

2

在委托中,您将拥有一个符合两种协议的控制器(可能是您的视图控制器),即位置管理器的协议和由 http rquest 控制器定义的协议。

视图控制器创建这两个对象并将自己指定为两者的委托。
它告诉位置管理器获取邮政编码。管理器完成后,它会在委托上发送适当的委托方法[self.delegate didFindZipCode:code onLocationManager: self]。由于委托是视图控制器,它实现了这个方法

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

一旦所需数据可用,请求控制器将以类似的方式通知视图控制器。


实际上块会以类似的方式处理这个问题——只是没有设置委托,应该调用它,但是传递了一个代码,一旦发生事情就会调用它。

于 2012-12-18T18:04:35.347 回答
2

这是一个草图 - (忽略错误条件和位置数据缓存问题)。这都可以在 viewController 中进行。获取邮政编码有一个块,但如果您愿意,可以通过代表完成其余部分。

//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 回答