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