代表上设置的事件

时间:2012-12-18 17:26:12

标签: iphone objective-c ios ipad cocoa

我试图理解一些关于委托和回调的概念。基本上我正在尝试创建一个基于zipcode的http请求。因此,在发出http请求之前,我调用了一个位置管理器并获取了一个邮政编码,但是,在这段时间内,我必须等待异步才能完成该任务,并获得反馈。这里的问题是,我从location-manager设置的委托与http-request类没有链接。所以,我试图了解如何将信息从委托传递回http请求。我正在寻找积木,但无论如何你还可以等待代表的回应?或者它也可以在异步任务中设置为BOOL属性,完成后可以触发请求。除了GCD之外,我还没有尝试过很多块,所以还是试着试试这个。

我欢迎任何建议。

3 个答案:

答案 0 :(得分:2)

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

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

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

,只要所需数据可用,请求控制器就会以类似的方式通知视图控制器。


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

答案 1 :(得分: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];
}

答案 2 :(得分:0)

有一个很棒的图书馆,名为AFNetworking,很容易实现。

它使用块,这非常简单地在类之间传递数据(取消委托)。